3

The psql \i command is able to execute a given SQL script but I need a way to pass parameters to the script.

Example: say you have this simple script

select * from :table LIMIT 1;

I've tried

my_db=> \i my-script.sql -v table="core.product"

but got this error

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


I know that running this on terminal will work, but I'm already inside psql.

psql -v table="core.product" -f my-script.sql
Erwin Brandstetter
  • 185,527
  • 28
  • 463
  • 633
Michael Pacheco
  • 133
  • 1
  • 1
  • 4

1 Answers1

5

Use \set to set a variable inside psql.
Read about SQL interpolation in the manual here:

Ideally, your script would read:

SELECT * FROM :"my_schema".:"my_table" LIMIT 1;

With schema and table double-quoted separately, for identifier-interpolation. Then set schema and table in psql without quotes like:

my_db=>\set my_schema core
my_db=>\set my_table product

Just the bare, case-sensitive names. Finally, execute:

my_db=>\i my-script.sql

This way, the script is safe against SQL injection.

Erwin Brandstetter
  • 185,527
  • 28
  • 463
  • 633