pq.Int64Array 没有被 Gorm 加载
pq.Int64Array not loaded by Gorm
使用 gorm 对 postgres table 进行 table 扫描,使用 libpq,它没有加载 pq.Int64Array。
简化模型:
type Event struct {
ExcludeDates pq.Int64Array // Array of StartTimes of single dates that have been deleted
}
执行 table 扫描的代码:
events, _ := gormdb.Model(&Event{}).Rows()
defer events.Close()
for events.Next() {
var event Event
gormdb.ScanRows(events, &event)
}
ExcludeDates
字段始终为空。
问题是我使用的 table 是由不同的 ORM 生成的,它的列名与 GORM 使用的命名方案不对应,所以数据没有正确加载到结构中.
您可以在 per-field 的基础上覆盖 GORM 的列命名方案,但如果您需要覆盖所有列名称,这可能会很痛苦。为了将来参考,因为它似乎没有记录,您可以通过重新定义 gorm.TheNamingStrategy.Column
函数来更改 GORM 用于列名的命名方案。默认情况下,GORM 将结构字段名称转换为数据库列名称的 snake case。此示例反而导致 GORM 将字段名称转换为简单的小写数据库列名称:
gorm.TheNamingStrategy.Column = func(in string) string {
return strings.ToLower(in)
}
使用 gorm 对 postgres table 进行 table 扫描,使用 libpq,它没有加载 pq.Int64Array。
简化模型:
type Event struct {
ExcludeDates pq.Int64Array // Array of StartTimes of single dates that have been deleted
}
执行 table 扫描的代码:
events, _ := gormdb.Model(&Event{}).Rows()
defer events.Close()
for events.Next() {
var event Event
gormdb.ScanRows(events, &event)
}
ExcludeDates
字段始终为空。
问题是我使用的 table 是由不同的 ORM 生成的,它的列名与 GORM 使用的命名方案不对应,所以数据没有正确加载到结构中.
您可以在 per-field 的基础上覆盖 GORM 的列命名方案,但如果您需要覆盖所有列名称,这可能会很痛苦。为了将来参考,因为它似乎没有记录,您可以通过重新定义 gorm.TheNamingStrategy.Column
函数来更改 GORM 用于列名的命名方案。默认情况下,GORM 将结构字段名称转换为数据库列名称的 snake case。此示例反而导致 GORM 将字段名称转换为简单的小写数据库列名称:
gorm.TheNamingStrategy.Column = func(in string) string {
return strings.ToLower(in)
}