Gorm:使用Array列批量插入ClickHouse

fkaflof6  于 2023-08-01  发布在  Go
关注(0)|答案(2)|浏览(205)

我想批量插入数据到我们的ClickHouse数据库。使用gorm,我可以轻松地使用

type audit struct{
 field1 string `json:"field1"`,
 field2 string `json:"field2"`, 
}

chDB.Table(tableName).CreateInBatches(audits, 5)

字符串
但是,如果audit包含如下数组字段,则其他字段的数据仍将保存在数据库中。只有带有数组的字段(如下所示field1)不会被保存。

type audit struct{
 field1 []string `json:"field1"`,
 field2 string   `json:"field2"`, 
}

chDB.Table(tableName).CreateInBatches(audits, 5)


错误:[error] unsupported data type: &[]
只有当我准备一个声明并保存数据,它才能工作。但是,在这种情况下,它不再是批处理插入

sqlDB, err := db.DB()
tx, err := sqlDB.Begin()
stmt, err := tx.PrepareContext(ctx, `insert into audit_table (field1, field2) values (?, ?)`)
_, err = stmt.ExecContext(ctx, clickhouse.Array(audit.field1), audit.field2)
err = tx.Commit()


有人能帮我一下吗?如何批量插入数组数据到ClickHouse列?

e3bfsja2

e3bfsja21#

您可能需要在clickhouse.Array列中插入clickhouse.Array类型

type audit struct{
 field1 clickhouse.Array `json:"field1"`,
 field2 string           `json:"field2"`, 
}

audits := audit{
  field1: clickhouse.Array([]string{"one", "three"}),
  field2: "two"
}

chDB.Table(tableName).CreateInBatches(audits, 5)

字符串

nfg76nw0

nfg76nw02#

这对我不起作用,我需要用正确的字段标记更新我的结构体,如下所示

type User struct {
    Timestamp    time.Time `gorm:"precision:6"`
    Name         string    `gorm:"type:LowCardinality(String)"`
    Age          int8
    DefaultValue string `gorm:"default:hello world"`
    Elapsed      time.Duration
    NullableInt  *int8    `gorm:"type:Nullable(Int8)"`
    Array        []string `gorm:"type:Array(String)"`
}

字符串
可以很容易地进行批量插入

// Batch Insert
    user1 := User{Timestamp: time.Now(), Age: 12, Name: "Bruce Lee", Arraa: []string{"hello", "ne"}}
    user2 := User{Timestamp: time.Now(), Age: 13, Name: "Feynman", Arraa: []string{"no", "me"}}
    user3 := User{Timestamp: time.Now(), Age: 14, Name: "Angeliz"}
    var users = []User{user1, user2, user3}
    db.Create(&users)

相关问题