clickhouse icon indicating copy to clipboard operation
clickhouse copied to clipboard

SkipDefaultTransaction = true时,没有办法通过gorm提供的方法写入数据

Open steden opened this issue 9 months ago • 3 comments

当我复用gorm.Open的*gorm.DB,且使用CreateInBatches方法写批量写入数据,总是返回:

  • result.RowsAffected = 0
  • result.Error = nil

在clickhouse表中,也没有写入成功。

最后没办法,通过调用CreateInBatches方法,并且开启Dry(为了拿到SQL)

session := gorm.Open(...)
	session.ormClient = session.ormClient.Session(&gorm.Session{
		SkipDefaultTransaction: session.ormClient.SkipDefaultTransaction,
		Logger:                 session.ormClient.Logger,
		DryRun:                 true,
	})
session.ormClient.Callback().Create().After("trace_before").Register("get_sql", func(db *gorm.DB) {
	session.SQL = db.Dialector.Explain(db.Statement.SQL.String(), db.Statement.Vars...)
	db.Callback().Create().Remove("get_sql")
})
session.CreateInBatches(arr,2000)

利用Create回调,拿到SQL后。再手动执行SQL:

session := gorm.Open(...)
session.Exec(SQL)

只有每次都gorm.Open,然后把生成的SQL,用Exec执行,才能成功。

steden avatar Oct 29 '23 08:10 steden