将 sqlx 与 postgresql 一起使用时出现错误:“缺少目标名称 rec_created_by”
type Client struct {
ClientID string `json:"client_id" db:"id"`
Name string `json:"name" db:"name"`
Version int16 `json:"version" db:"version"`
IsActivated bool `json:"is_activated" db:"is_activated"`
RecCreatedBy string `json:"rec_created_by" db:"rec_created_by"`
RecCreatedByUser *User `json:"rec_created_by_user" db:"-"`
RecCreated *time.Time `json:"rec_created" db:"rec_created"`
RecModifiedBy string `json:"rec_modified_by" db:"rec_modified_by"`
RecModifiedByUser *User `json:"rec_modified_by_user" db:"-"`
RecModified *time.Time `json:"rec_modified" db:"rec_modified"`
CultureID string `json:"culture_id" db:"culture_id"`
...
}
func (c *Client) Get(id string) error {
db, err := sqlx.Connect(settings.Settings.Database.DriverName, settings.Settings.GetDbConn())
if err != nil {
log.Fatal(err)
}
defer db.Close()
_client := Client{}
err = db.QueryRowx("SELECT id, name, version, is_activated, rec_created_by, rec_created, rec_modified_by, rec_modified, culture_id, amount_decimal_places, amount_rounding_precision, \"unit-amount_decimal_places\", \"unit-amount_rounding_precision\", currency_lcy_id FROM client WHERE id=$1", id).StructScan(&_client)
if err == sql.ErrNoRows {
return ErrClientNotFound
} else if err != nil {
return err
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
我有db:"rec_created_by"我的客户端类型,但为什么会发生错误。
D. *_*ell 11
对于那些遇到类似问题的人,这里有一些可能的原因。
结构字段必须导出才能由 sqlx 封送和解封。
type foo struct {
bar string `db:"bar"` // This wont work. 'bar' needs to be 'Bar'
}
Run Code Online (Sandbox Code Playgroud)
是的。这些我都做了。
type Foo struct {
bar string `db="bar"` // Should be : not =
}
Run Code Online (Sandbox Code Playgroud)
type Foo struct {
bar string `json:"bar", db:"bar"` // There should not be a comma
}
Run Code Online (Sandbox Code Playgroud)
type foo struct {
BarName string `db:"bar_name"`
}
myfoo := foo{}
db.Get(&myfoo, `SELECT barname FROM foo_table WHERE barname = 'bar string'`)
// This will fail because the returned column is missing the '_'
Run Code Online (Sandbox Code Playgroud)
type foo struct {
Bar string `db:"Bar"`
}
myfoo := foo{}
db.Get(&myfoo, `SELECT Bar FROM foo_table WHERE Bar = 'bar string'`)
// This will fail because the returned column is actually 'bar'.
Run Code Online (Sandbox Code Playgroud)
Postgres 区分大小写。所以Bar和bar并不相同。
您可以使用大写标识符,但它们必须用双引号引起来。
myfoo := foo{}
db.Get(&myfoo, `SELECT "Bar" FROM foo_table WHERE "Bar" = 'bar string'`)
Run Code Online (Sandbox Code Playgroud)
当然,如果您使用以下命令创建表格...
CREATE TABLE foo_table
(
Bar TEXT NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
好吧...该列实际上将被命名为bar。这是因为 Postgres 会将所有未加引号的标识符转换为小写。
您可以通过以下任一方式解决此问题...
我们可以通过这样编写查询来解决上述问题......
type foo struct {
Bar string `db:"FooBar"`
}
myfoo := foo{}
db.Get(&myfoo, `SELECT bar as "FooBar" FROM foo_table WHERE bar = 'bar string'`)
// This will work because we have renamed the returned column to "FooBar".
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4269 次 |
| 最近记录: |