如何将间隔参数传递给准备好的语句?
How to pass an interval parameter to a prepared statement?
我想删除我的 Postgres 数据库中超过 X 分钟的所有数据库条目。我在 go 中准备好的语句如下所示:
delete
from my_table
where expires < (to_timestamp() - ' minutes'::interval);
如何正确传递第二个参数
?
PS:我知道有不同的语句可以解决这个问题,但我对如何传递引用的参数很感兴趣。
您可以 cast the parameter to text
and then concatenate 使用字符串 ' minutes'
。
delete from my_table
where expires < (to_timestamp() - (::text || ' minutes')::interval
更新:实际上,因为 postgres 确实有一个 any || text
运算符,其结果是 text
,您不需要类型转换参数。
您也可以参数化整个区间字符串。这消除了对 text
和 concat.
的中间转换的需要
query := `
delete from my_table
where expires < (to_timestamp() - ::interval);
`
interval := fmt.Sprintf("%d minutes", mins)
db.Exec(query, timestamp, interval)
无法将参数插入字符串文字。
针对您的情况的可能解决方案是将一个数字乘以一个间隔:
where expires < (to_timestamp() - * '1 minute'::interval)
您可以使用make_interval
delete from my_table
where expires < (to_timestamp() - make_interval(mins => ));
我想删除我的 Postgres 数据库中超过 X 分钟的所有数据库条目。我在 go 中准备好的语句如下所示:
delete
from my_table
where expires < (to_timestamp() - ' minutes'::interval);
如何正确传递第二个参数?
PS:我知道有不同的语句可以解决这个问题,但我对如何传递引用的参数很感兴趣。
您可以 cast the parameter to text
and then concatenate 使用字符串 ' minutes'
。
delete from my_table
where expires < (to_timestamp() - (::text || ' minutes')::interval
更新:实际上,因为 postgres 确实有一个 any || text
运算符,其结果是 text
,您不需要类型转换参数。
您也可以参数化整个区间字符串。这消除了对 text
和 concat.
query := `
delete from my_table
where expires < (to_timestamp() - ::interval);
`
interval := fmt.Sprintf("%d minutes", mins)
db.Exec(query, timestamp, interval)
无法将参数插入字符串文字。
针对您的情况的可能解决方案是将一个数字乘以一个间隔:
where expires < (to_timestamp() - * '1 minute'::interval)
您可以使用make_interval
delete from my_table
where expires < (to_timestamp() - make_interval(mins => ));