I 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()实际上准备,执行和关闭一个准备 声明。这是对数据库的三次往返。如果你不小心 ,你可以翻三倍数据库的交互次数的 应用使得
,但我认为,在第二种情况下事先准备好的声明将在函数结束时被删除。
[This might help](https://stackoverflow.com/questions/37683218/golang-sql-drivers-prepare-statement/37686891#37686891) – Snowman