DryRun Mode ใน GORM คือการเปิดโหมดทดลองทำการ query โดยไม่ทำการ execute จริงๆ บนฐานข้อมูล ซึ่งสามารถเปิดใช้งานได้โดยการเรียกใช้ method DryRun() บน instance ของ GORM DB object ก่อนทำการ query หรือ execute การทำงานจะคล้ายกับการทำ query จริง ๆ แต่จะไม่มีการเขียนหรืออัพเดตข้อมูลใด ๆ บนฐานข้อมูลจริง ๆ

การใช้งาน DryRun Mode สามารถช่วยให้เราสามารถตรวจสอบ SQL statement ที่จะถูก generate ขึ้นมาจาก GORM ได้อย่างละเอียด และช่วยให้เราตรวจสอบว่าการ query หรือ execute จะส่งผลเปลี่ยนแปลงอะไรกับฐานข้อมูลหรือไม่ โดยไม่ต้องเปิด database connection จริง ๆ ซึ่งช่วยลดความเสี่ยงของการเขียนโค้ดที่อาจจะส่งผลกระทบกับฐานข้อมูลของเราได้เป็นอย่างมาก โดยเฉพาะเมื่อเราต้องการทำการ query หรือ execute บนข้อมูลสำคัญที่ไม่สามารถแก้ไขหรือลบได้โดยไม่มีการตรวจสอบก่อนทำการ execute จริง ๆ

ตัวอย่าง code mode เมื่อเปิด mode DryRun

package main

import (
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

type Product struct {
	gorm.Model
	Code  string
	Price uint
}

func main() {
	// Connect database sqlite
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})

	// Handle error
	if err != nil {
		panic("failed to connect database")
	}

	// Enable DryRun Mode
	db = db.Session(&gorm.Session{DryRun: true})

	// Migrate the schema
	db.AutoMigrate(&Product{})

	// Create
	db.Create(&Product{Code: "D42", Price: 100})

}

เมื่อ run คำสั่งนี้จะเห็นว่าที่ console จะ print raw SQL ออกมาทำให้เราสามารถตรวจสอบได้ว่าเป็น SQL ที่เราต้องการจริงๆหรือไม่และจะไม่ไปแตะ database จริงๆ ดังนี้

CREATE TABLE `products` (`id` integer,`created_at` datetime,`updated_at` datetime,`deleted_at` datetime,`code` text,`price` integer,PRIMARY KEY (`id`));
CREATE INDEX `idx_products_deleted_at` ON `products`(`deleted_at`);

เพียงเท่านี้ก็จะสามารถ debug SQL ได้แล้ว