使用 sqlx 插入行,是否可以避免显式列出字段?
insert rows with sqlx, is it possible to avoid listing the fields explicitly?
我正在使用 sqlx 库,如下所示:
type MyData {
Field1 string `json:"db:field1"`
Field2 string `json:"db:field2"`
}
...
res, err := db.Exec("INSERT INTO XXX (field1, field2) VALUES (?, ?)", data.XX, data.XX)
是否可以避免明确指定“field1,field2”,让 sqlx 自动创建查询和绑定,例如
db.Exec2("table_name", data)
我没有找到相关的方法。
没有。包 sqlx
只是 DB 驱动程序的包装器。它不是 ORM。它需要用户提供的有效 SQL 查询字符串。您可以通过编程方式构造查询字符串,并设计一些方法来使用 reflect
包从结构标签构建列名,但为什么要重新发明轮子呢?使用较低级别的包作为 sqlx
的好处恰恰是维护您自己的查询,以换取不在您的代码库中引入 ORM 框架。相反,使用 ORM 则相反。
Gorm instead has a set of conventions 即开即用。您甚至不必指定数据库标签:
GORM prefer convention over configuration, by default, GORM uses ID as primary key, pluralize struct name to snake_cases as table name, snake_case as column name, and uses CreatedAt, UpdatedAt to track creating/updating time
type MyData {
Field1 string `json:"field1"`
Field2 string `json:"field2"`
}
data := MyData {
Field1: "foo",
Field2: "bar",
}
result := db.Create(&data)
// results in something like this:
// INSERT INTO my_datas (field1, field2) VALUES ('foo', 'bar')
我正在使用 sqlx 库,如下所示:
type MyData {
Field1 string `json:"db:field1"`
Field2 string `json:"db:field2"`
}
...
res, err := db.Exec("INSERT INTO XXX (field1, field2) VALUES (?, ?)", data.XX, data.XX)
是否可以避免明确指定“field1,field2”,让 sqlx 自动创建查询和绑定,例如
db.Exec2("table_name", data)
我没有找到相关的方法。
没有。包 sqlx
只是 DB 驱动程序的包装器。它不是 ORM。它需要用户提供的有效 SQL 查询字符串。您可以通过编程方式构造查询字符串,并设计一些方法来使用 reflect
包从结构标签构建列名,但为什么要重新发明轮子呢?使用较低级别的包作为 sqlx
的好处恰恰是维护您自己的查询,以换取不在您的代码库中引入 ORM 框架。相反,使用 ORM 则相反。
Gorm instead has a set of conventions 即开即用。您甚至不必指定数据库标签:
GORM prefer convention over configuration, by default, GORM uses ID as primary key, pluralize struct name to snake_cases as table name, snake_case as column name, and uses CreatedAt, UpdatedAt to track creating/updating time
type MyData {
Field1 string `json:"field1"`
Field2 string `json:"field2"`
}
data := MyData {
Field1: "foo",
Field2: "bar",
}
result := db.Create(&data)
// results in something like this:
// INSERT INTO my_datas (field1, field2) VALUES ('foo', 'bar')