为了账号安全,请及时绑定邮箱和手机立即绑定

如何将间隔参数传递给预准备语句?

如何将间隔参数传递给预准备语句?

Go
收到一只叮咚 2022-09-19 21:22:53
我想删除 Postgres 数据库中早于 X 分钟的所有数据库条目。我在go中准备好的声明看起来像这样:deletefrom my_tablewhere expires < (to_timestamp($1) - '$2 minutes'::interval);如何正确传递第二个参数?$2PS:我知道有不同的语句可以解决这个问题,但我对如何传递引用的参数非常感兴趣。
查看完整描述

4 回答

?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

无法将参数内插到字符串文本中。

对于您的情况,一个可能的解决方案是将一个带有间隔的数字相乘:

where expires < (to_timestamp($1) - $2 * '1 minute'::interval)


查看完整回答
反对 回复 2022-09-19
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

可以将参数强制转换为 字符串 ,然后将其与字符串 连接text' minutes'

delete from my_table

where expires < (to_timestamp($1) - ($2::text || ' minutes')::interval

UPDATE:实际上,由于postgres确实有一个运算符,其结果是 ,你不应该需要类型转换参数。any || texttext




查看完整回答
反对 回复 2022-09-19
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

您可以使用make_interval


delete from my_table

where expires < (to_timestamp($1) - make_interval(mins => $2));


查看完整回答
反对 回复 2022-09-19
?
慕村225694

TA贡献1880条经验 获得超4个赞

您还可以改为参数化整个间隔字符串。这消除了对中间铸造和连接的需求。text


query := `

  delete from my_table

  where expires < (to_timestamp($1) - $2::interval);

`

interval := fmt.Sprintf("%d minutes", mins)

db.Exec(query, timestamp, interval)


查看完整回答
反对 回复 2022-09-19
  • 4 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信