セッション

GORM は Session メソッドを提供します。これは 新しいセッションメソッド で、設定付きで新しいセッションモードを作成できます。

// Session Configuration
type Session struct {
DryRun bool
PrepareStmt bool
NewDB bool
Initialized bool
SkipHooks bool
SkipDefaultTransaction bool
DisableNestedTransaction bool
AllowGlobalUpdate bool
FullSaveAssociations bool
QueryFields bool
Context context.Context
Logger logger.Interface
NowFunc func() time.Time
CreateBatchSize int
}

DryRun

実行せずに SQL を生成します。これは、生成された SQL を準備またはテストするために使用できます。例えば、

// session mode
stmt := db.Session(&Session{DryRun: true}).First(&user, 1).Statement
stmt.SQL.String() //=> SELECT * FROM `users` WHERE `id` = $1 ORDER BY `id`
stmt.Vars //=> []interface{}{1}

// globally mode with DryRun
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{DryRun: true})

// different databases generate different SQL
stmt := db.Find(&user, 1).Statement
stmt.SQL.String() //=> SELECT * FROM `users` WHERE `id` = $1 // PostgreSQL
stmt.SQL.String() //=> SELECT * FROM `users` WHERE `id` = ? // MySQL
stmt.Vars //=> []interface{}{1}

最終的な SQL を生成するには、次のコードを使用できます。

// NOTE: the SQL is not always safe to execute, GORM only uses it for logs, it might cause SQL injection
db.Dialector.Explain(stmt.SQL.String(), stmt.Vars...)
// SELECT * FROM `users` WHERE `id` = 1

PrepareStmt

PreparedStmt は、SQL を実行するときにプリペアドステートメントを作成し、将来の呼び出しを高速化するためにキャッシュします。例えば、

// globally mode, all DB operations will create prepared statements and cache them
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
PrepareStmt: true,
})

// session mode
tx := db.Session(&Session{PrepareStmt: true})
tx.First(&user, 1)
tx.Find(&users)
tx.Model(&user).Update("Age", 18)

// returns prepared statements manager
stmtManger, ok := tx.ConnPool.(*PreparedStmtDB)

// close prepared statements for *current session*
stmtManger.Close()

// prepared SQL for *current session*
stmtManger.PreparedSQL // => []string{}

// prepared statements for current database connection pool (all sessions)
stmtManger.Stmts // map[string]*sql.Stmt

for sql, stmt := range stmtManger.Stmts {
sql // prepared SQL
stmt // prepared statement
stmt.Close() // close the prepared statement
}

NewDB

オプション NewDB を使用して、条件なしで新しい DB を作成します。例えば、

tx := db.Where("name = ?", "jinzhu").Session(&gorm.Session{NewDB: true})

tx.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1

tx.First(&user, "id = ?", 10)
// SELECT * FROM users WHERE id = 10 ORDER BY id

// Without option `NewDB`
tx2 := db.Where("name = ?", "jinzhu").Session(&gorm.Session{})
tx2.First(&user)
// SELECT * FROM users WHERE name = "jinzhu" ORDER BY id

Initialized

新しい初期化された DB を作成します。これは、もはやメソッドチェーン/ゴルーチンセーフではありません。 メソッドチェーン を参照してください。

tx := db.Session(&gorm.Session{Initialized: true})

Skip Hooks

Hooks メソッドをスキップする場合は、SkipHooks セッションモードを使用できます。例えば、

DB.Session(&gorm.Session{SkipHooks: true}).Create(&user)

DB.Session(&gorm.Session{SkipHooks: true}).Create(&users)

DB.Session(&gorm.Session{SkipHooks: true}).CreateInBatches(users, 100)

DB.Session(&gorm.Session{SkipHooks: true}).Find(&user)

DB.Session(&gorm.Session{SkipHooks: true}).Delete(&user)

DB.Session(&gorm.Session{SkipHooks: true}).Model(User{}).Where("age > ?", 18).Updates(&user)

DisableNestedTransaction

DB トランザクション内で Transaction メソッドを使用する場合、GORM はネストされたトランザクションをサポートするために SavePoint(savedPointName)RollbackTo(savedPointName) を使用します。DisableNestedTransaction オプションを使用して無効にできます。例えば、

db.Session(&gorm.Session{
DisableNestedTransaction: true,
}).CreateInBatches(&users, 100)

AllowGlobalUpdate

GORM はデフォルトでグローバルな更新/削除を許可せず、ErrMissingWhereClause エラーを返します。このオプションを true に設定して有効にすることができます。例えば、

db.Session(&gorm.Session{
AllowGlobalUpdate: true,
}).Model(&User{}).Update("name", "jinzhu")
// UPDATE users SET `name` = "jinzhu"

FullSaveAssociations

GORM は、レコードを作成/更新するときに Upsert を使用して関連付けとその参照を自動保存します。関連付けのデータを更新する場合は、FullSaveAssociations モードを使用する必要があります。例えば、

db.Session(&gorm.Session{FullSaveAssociations: true}).Updates(&user)
// ...
// INSERT INTO "addresses" (address1) VALUES ("Billing Address - Address 1"), ("Shipping Address - Address 1") ON DUPLICATE KEY SET address1=VALUES(address1);
// INSERT INTO "users" (name,billing_address_id,shipping_address_id) VALUES ("jinzhu", 1, 2);
// INSERT INTO "emails" (user_id,email) VALUES (111, "jinzhu@example.com"), (111, "jinzhu-2@example.com") ON DUPLICATE KEY SET email=VALUES(email);
// ...

Context

Context オプションを使用すると、後続の SQL 操作に Context を設定できます。例えば、

timeoutCtx, _ := context.WithTimeout(context.Background(), time.Second)
tx := db.Session(&Session{Context: timeoutCtx})

tx.First(&user) // query with context timeoutCtx
tx.Model(&user).Update("role", "admin") // update with context timeoutCtx

GORM はショートカットメソッド WithContext も提供しています。以下はその定義です。

func (db *DB) WithContext(ctx context.Context) *DB {
return db.Session(&Session{Context: ctx})
}

Logger

GORM では、Logger オプションを使用して組み込みのロガーをカスタマイズできます。例えば、

newLogger := logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
SlowThreshold: time.Second,
LogLevel: logger.Silent,
Colorful: false,
})
db.Session(&Session{Logger: newLogger})

db.Session(&Session{Logger: logger.Default.LogMode(logger.Silent)})

詳細については、ロガー を確認してください。

NowFunc

NowFunc を使用すると、GORM の現在時刻を取得する関数を変更できます。例えば、

db.Session(&Session{
NowFunc: func() time.Time {
return time.Now().Local()
},
})

Debug

Debug は、セッションの Logger をデバッグモードに変更するショートカットメソッドです。以下はその定義です。

func (db *DB) Debug() (tx *DB) {
return db.Session(&Session{
Logger: db.Logger.LogMode(logger.Info),
})
}

QueryFields

フィールドで選択

db.Session(&gorm.Session{QueryFields: true}).Find(&user)
// SELECT `users`.`name`, `users`.`age`, ... FROM `users` // with this option
// SELECT * FROM `users` // without this option

CreateBatchSize

デフォルトのバッチサイズ

users = [5000]User{{Name: "jinzhu", Pets: []Pet{pet1, pet2, pet3}}...}

db.Session(&gorm.Session{CreateBatchSize: 1000}).Create(&users)
// INSERT INTO users xxx (5 batches)
// INSERT INTO pets xxx (15 batches)

プラチナスポンサー

ゴールドスポンサー

プラチナスポンサー

ゴールドスポンサー