将变量传递给 psql 脚本
Posted
技术标签:
【中文标题】将变量传递给 psql 脚本【英文标题】:Passing variables to psql script 【发布时间】:2018-06-24 15:46:42 【问题描述】:我已经搜索了一段时间,但似乎找不到明确的答案...我正在尝试从终端运行 psql 脚本,同时传递一个表变量名和另一个变量作为psql 脚本。
BASH 命令:
psql db1 -U user1 -f '/.../Desktop/.../sample.sql' -v table=pg2 -v v1="'2018-02-01'";
PSQL 脚本:
SELECT count(*) FROM :table WHERE datekey = :v1;
以上工作。但是,我希望能够将表名和附加变量转换为脚本本身中的字符串,以便可以在我定义的另一个函数中使用它。例如,我希望 pg2 的表名可以作为字符串 'pg2' 使用。与 datekey 变量类似的要求。这可能吗?我的观察是,只有在 CRUD 操作或 WHERE 子句中使用时才能传递变量。
【问题讨论】:
见:Difference between single and double quotes in bash 【参考方案1】:从我从您的问题中得到的信息是对 bash 中变量的作用的误解。试试下面的脚本是否有帮助:
#!/bin/bash
user="user1"
sqlfile='/.../Desktop/.../sample.sql'
table='pg2'
v1="'2018-02-01'"
psql db1 -U "$user" -f "$sqlfile" -v table=$table -v v1="$v1"
【讨论】:
谢谢 Ljm。我试图找到一种方法来获取脚本中的 $table 和 $v1 变量,并将它们都变成 psql 脚本本身的字符串。我这样做的原因是我在 psql 脚本中有另一个 plpgsql 函数,它需要将表名和变量作为字符串参数输入。有没有办法传递 $table 变量并在 psql 脚本中将其转换为字符串?【参考方案2】:在堆栈/其他站点上关闭其他答案,有一种相当简单的方法可以在 psql 脚本本身中容纳此问题。例如,原来的 BASH 命令是:
psql db1 -U user1 -f '/.../Desktop/.../sample.sql' -v table=pg2 -v v1="'2018-02-01'";
...在脚本中,需要为名为“copyFunction”的 plpgsql 函数输入两个字符串参数。这可以通过将表名放在冒号后的引号中并保持第二个变量不变来实现。如果需要,也可以将第二个变量放在引号中。
SELECT copyfunction(:'table', :v1);
【讨论】:
太棒了。对于需要将变量插入“....”的情况,这对我很有帮助,如下所示,简单的 :variable_name 不起作用: CREATE TABLESPACE :tablespace_name OWNER :db_owner LOCATION :'tablespace_folder'; 您能否进一步详细说明为什么在表格周围需要引号,而不是 v1?以上是关于将变量传递给 psql 脚本的主要内容,如果未能解决你的问题,请参考以下文章