【发布时间】:2016-06-15 20:06:34
【问题描述】:
我 stillstruggle 了解 Go 中准备好的语句的好处/psql。
假设我有一个结构
type Brand struct {
Id int `json:"id,omitempty"`
Name string `json:"name,omitempty"`
Issued_at *time.Time `json:"issued_at,omitempty"`
}
还有一些表 brands,其中 id 是一个唯一字段。现在我想使用 id 从该表中检索元素。
我可以使用 QueryRow 编写以下函数。
func GetBrand1(id int) (Brand, error) {
brand := Brand{}
if err := Db.QueryRow("SELECT name, issued_at FROM brands WHERE id = $1", id).Scan(&brand.Name, &brand.Issued_at); err != nil {
if err == sql.ErrNoRows {
return brand, nil
}
return brand, err
}
brand.Id = id
return brand, nil
}
我可以使用准备好的语句做同样的事情(我希望它是一样的):
func GetBrand2(id int) (Brand, error) {
brand := Brand{}
stmt, err := Db.Prepare("SELECT name, issued_at FROM brands WHERE id = $1")
if err != nil {
return brand, err
}
defer stmt.Close()
rows, err := stmt.Query(id)
if err != nil {
return brand, err
}
defer rows.Close()
for rows.Next() {
rows.Scan(&brand.Name, &brand.Issued_at)
brand.Id = id
return brand, err
}
if err = rows.Err(); err != nil {
return brand, err
}
return brand, err
}
现在在我的应用程序中,我计划多次执行GetBrand* 函数(使用不同的参数)。 Will 是其中一种实现比另一种更可取(就 sql-requests/memory/anything 而言)。或者他们俩都很糟糕,我最好做点别的。
我读过this 和followed up link,我看到了:
db.Query() 实际上准备、执行和关闭一个准备好的 陈述。这是数据库的三个往返。如果你不是 小心,您可以将数据库交互次数增加三倍 应用使
但我认为第二种情况下的准备好的语句将在函数末尾删除。
【问题讨论】:
标签: go prepared-statement