postgresql - psql \i 带参数的元命令
问题描述
我有一个 sql 脚本,用于手动检查长时间运行的进程的状态。我的服务器目前是 postgres 10。该脚本包含几十个查询。但是,每个查询都需要当前进程的 id(不是 linux pid,而是 db 中的一列)。
所以,就像
SELECT * FROM table1 WHERE id = 'xxx';
SELECT * FROM table2 WHERE id = 'xxx';
... and so forth
我有一个 sql 脚本,我用最新的 id 不断更新,并运行
db# \i my-script.sql
如果我可以将变量传递到脚本中,那就太好了。例如,也许脚本是
SELECT * FROM table1 WHERE id = '$1';
SELECT * FROM table2 WHERE id = '$1';
我可以跑
db# \i my-script.sql 'xxx'
它会正确地用那个值替换$1
sql 脚本中的所有值。多个参数的奖励积分(例如$2
等等)。
OTOH,我可以编写一个包装 psql 命令行的 bash 脚本,但我需要放到 shell 中执行它 - 如果我已经在 psql 中,我就在那里。
有什么建议吗?
谢谢!
解决方案
使用psql
变量。
在脚本中,写
\prompt 'Please enter id:' myid
SELECT * FROM table1 WHERE id = :'myid';
如果您不想要交互式提示,请省略\prompt
并在调用脚本中设置变量:
\set myid 1234
推荐阅读
- android - 如何通过 SSH 启动 headfull(与 headless)android 模拟器
- r - 阴影密度曲线下的区域,以标记最高密度间隔 (HDI)
- android - 如何创建带有回复的评论部分?- 安卓
- python - 即使从“https://www.python.org/downloads/”(Windows 10)成功安装 Python 3.8.0 后仍提示“找不到 python”
- javascript - 删除使用 jquery remove 动态添加的 html div
- c++ - LeetCode #377的C++ DP解决方案,这段代码有bug吗?
- neural-network - 如何在 DiffEqFlux.lj neuroODE 中创建任意参数化层?Julia Julialang Flux.jl
- python - 如何在 Python 中更新 dict 值?
- java - 在 java 中使用 Formatter 写入和读取文件时面临问题
- python - 如果值在嵌套列表中,则获取父键 (dict_values)