如何通过 psql \i 命令将参数传递给 sql 脚本

Mic*_*eco 3 postgresql sql-injection psql

psql\i命令能够执行给定的 SQL 脚本,但我需要一种将参数传递给脚本的方法。

示例:假设您有这个简单的脚本

select * from :table LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

我试过了

my_db=> \i my-script.sql -v table="core.product"
Run Code Online (Sandbox Code Playgroud)

但出现这个错误

psql:my-script.sql:1: ERROR:  syntax error at or near ":"
LINE 1: select * from :table LIMIT 1;
                      ^
\i: extra argument "-v" ignored
\i: extra argument "table="core.product"" ignored

Run Code Online (Sandbox Code Playgroud)

我知道在终端上运行它会起作用,但我已经在 psql 中了。

psql -v table="core.product" -f my-script.sql
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 5

用于\set在 psql 中设置变量。
在此处阅读手册中有关 SQL 插值的内容:

理想情况下,您的脚本应为:

SELECT * FROM :"my_schema".:"my_table" LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

模式和表分别用双引号引起来,用于标识符插值。然后在 psql 中设置模式和表,不带引号,例如:

my_db=>\set my_schema core
my_db=>\set my_table product
Run Code Online (Sandbox Code Playgroud)

只是简单的、区分大小写的名称。最后执行:

my_db=>\i my-script.sql
Run Code Online (Sandbox Code Playgroud)

这样,脚本就可以安全地防止 SQL 注入。