generate_series returns 未知的 Postgres 查询中的占位符
Placeholders in the Postgres query for generate_series returns unknown
我尝试使用这样的占位符进行查询
database.Query("select login,displayname from (select distinct +trunc(random()*)::integer as id from generate_series(,) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
它抛出一个错误:
pq: function generate_series(unknown, unknown) is not unique
然后我找到了将查询格式化为字符串的解决方案
query:=fmt.Sprintf("select login,displayname from (select distinct %v+trunc(random()*%v)::integer as id from generate_series(%v,%v) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
而且有效。
我想让它以正确的方式工作,但我不明白为什么不行。
已更新:
var min_id int64
var max_id int64
err:=_database.QueryRow("select min(id),max(id) from users").Scan(&min_id, &max_id)
if err!=nil {
log.Panicf("Failed to get min and max %v",err.Error())
return
}
var rows *sql.Rows
query:=fmt.Sprintf("select login,displayname from (select distinct %v+trunc(random()*%v)::integer as id from generate_series(%v,%v) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
log.Printf(query)
rows,err=_database.Query("select login,displayname from (select distinct +trunc(random()*)::integer as id from generate_series(,) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
if err!=nil {
log.Panicf("failed to get random entries: %v",err)
}
尝试分解您的查询。您会看到第一部分工作正常:
db.QueryRow("SELECT +trunc(random()*) as test", 10, 5)
这可能有效,因为 </code> 和 <code>
与数学运算符一起使用(and/or 因为 trunc()
和 random()
都是 return 数字), 所以 postgres 可以推断数据类型。
看来是 generate_series()
参数没有被正确确定。 Postgres 可以 根据参数推断数据类型,例如
if err := db.QueryRow("SELECT trunc(,2) as test", 1.4343).Scan(&output); err != nil {panic(err)}
// output = 1.43
但是,如果它是多态函数,可能会出现歧义并且会失败,例如
if err := db.QueryRow("SELECT trunc() as test", 1.4343).Scan(&output); err != nil {panic(err)}
// panic: pq: function trunc(unknown) is not unique
为避免歧义,请在准备好的语句中显式转换参数,例如:generate_series(::int,::int)
我尝试使用这样的占位符进行查询
database.Query("select login,displayname from (select distinct +trunc(random()*)::integer as id from generate_series(,) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
它抛出一个错误:
pq: function generate_series(unknown, unknown) is not unique
然后我找到了将查询格式化为字符串的解决方案
query:=fmt.Sprintf("select login,displayname from (select distinct %v+trunc(random()*%v)::integer as id from generate_series(%v,%v) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
而且有效。
我想让它以正确的方式工作,但我不明白为什么不行。
已更新:
var min_id int64
var max_id int64
err:=_database.QueryRow("select min(id),max(id) from users").Scan(&min_id, &max_id)
if err!=nil {
log.Panicf("Failed to get min and max %v",err.Error())
return
}
var rows *sql.Rows
query:=fmt.Sprintf("select login,displayname from (select distinct %v+trunc(random()*%v)::integer as id from generate_series(%v,%v) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
log.Printf(query)
rows,err=_database.Query("select login,displayname from (select distinct +trunc(random()*)::integer as id from generate_series(,) g ) r join users using(id) limit 10",min_id,max_id-min_id,min_id,max_id)
if err!=nil {
log.Panicf("failed to get random entries: %v",err)
}
尝试分解您的查询。您会看到第一部分工作正常:
db.QueryRow("SELECT +trunc(random()*) as test", 10, 5)
这可能有效,因为 </code> 和 <code>
与数学运算符一起使用(and/or 因为 trunc()
和 random()
都是 return 数字), 所以 postgres 可以推断数据类型。
看来是 generate_series()
参数没有被正确确定。 Postgres 可以 根据参数推断数据类型,例如
if err := db.QueryRow("SELECT trunc(,2) as test", 1.4343).Scan(&output); err != nil {panic(err)}
// output = 1.43
但是,如果它是多态函数,可能会出现歧义并且会失败,例如
if err := db.QueryRow("SELECT trunc() as test", 1.4343).Scan(&output); err != nil {panic(err)}
// panic: pq: function trunc(unknown) is not unique
为避免歧义,请在准备好的语句中显式转换参数,例如:generate_series(::int,::int)