如何在Postgresql命令行中指定运行sql文件的模式

时间:2012-12-07 21:02:51

标签: postgresql

我像这样对我的数据库运行脚本......

psql -d myDataBase -a -f myInsertFile.sql

唯一的问题是我希望能够在此命令中指定运行脚本的模式。我可以调用set search_path ='my_schema_01',但这些文件应该是可移植的。我怎么能这样做?

8 个答案:

答案 0 :(得分:63)

您可以创建一个包含set schema ...语句的文件,然后包含您要运行的实际文件:

创建文件run_insert.sql

set schema 'my_schema_01';
\i myInsertFile.sql

然后使用:

调用它
psql -d myDataBase -a -f run_insert.sql

答案 1 :(得分:41)

更通用的方法是设置search_path(应该在PostgreSQL 7.x及以上版本中工作):

SET search_path TO myschema;

请注意,set schema myschema是上述命令的别名,在8.x中

另请参阅:http://www.postgresql.org/docs/9.3/static/ddl-schemas.html

答案 2 :(得分:31)

主要示例

以下示例将使用架构 myschema 在数据库 mydatabase 上运行 myfile.sql

psql "dbname=mydatabase options=--search_path=myschema" -a -f myfile.sql

这种方式的工作方式是psql命令的第一个参数是 dbname 参数。文档提到可以提供connection string

  

如果此参数包含=符号或以有效的URI前缀开头   (postgresql://或postgres://),它被视为conninfo字符串

dbname keyword指定要连接的数据库,options keyword允许您指定在连接启动时发送到服务器的命令行选项。这些选项在server configuration chapter中有详细说明。我们用于选择架构的选项是search_path

另一个例子

以下示例将使用架构 myschema 连接到数据库 mydatabase 上的主机 myhost =特殊字符必须使用转义序列%3D进行网址转义。

psql postgres://myuser@myhost?options=--search_path%3Dmyschema

答案 3 :(得分:6)

可以使用PGOPTIONS环境变量以灵活的方式实现此目的。

在Unix shell中:

PGOPTIONS="--search_path=my_schema_01" psql -d myDataBase -a -f myInsertFile.sql

如果脚本或子shell中有多个需要相同选项的调用,则只需将PGOPTIONS设置一次并导出即可。

PGOPTIONS="--search_path=my_schema_01"
export PGOPTIONS

psql -d somebase
psql -d someotherbase
...

或从外部设置PGOPTIONS来调用顶级shell脚本

PGOPTIONS="--search_path=my_schema_01"  ./my-upgrade-script.sh

在Windows CMD环境中,set PGOPTIONS=value应该可以正常工作。

答案 4 :(得分:1)

我正在使用这样的东西,效果很好:*: - )

(echo "set schema 'acme';" ; \
  cat ~/git/soluvas-framework/schedule/src/main/resources/org/soluvas/schedule/tables_postgres.sql) \
  | psql -Upostgres -hlocalhost quikdo_app_dev 

注意:仅限Linux / Mac / Bash,但也许在Windows / PowerShell中也有办法实现。

答案 5 :(得分:0)

为我工作:

psql postgresql://myuser:password@myhost/my_schema_01 -f myInsertFile.sql

答案 6 :(得分:0)

就我而言,我想动态地将架构添加到文件中,以便用户从 cli 提供的任何架构名称,我都将使用提供的架构名称运行 sql 文件。 为此,我替换了 sql 文件中的一些文本。首先我像这样在文件中添加了 {{schema}}

CREATE OR REPLACE FUNCTION {{schema}}.usp_dailygaintablereportdata(

然后在 {{schema}} 命令的帮助下用用户提供的架构名称动态替换 sed

sed -i "s/{{schema}}/$pgSchemaName/" $filename
result=$(psql -U $user -h $host -p $port -d $dbName -f "$filename" 2>&1)
sed -i "s/$pgSchemaName/{{schema}}/" $filename

首先完成替换,然后运行目标文件,然后再次恢复我们的替换

答案 7 :(得分:-1)

我在尝试在中间模式上进行一些数据导入时遇到了类似的问题(稍后我们将继续进行最后一个模式)。因为我们依赖于诸如扩展之类的东西(例如PostGIS)," run_insert" sql文件没能完全解决问题。

过了一段时间,我们发现至少在Postgres 9.3中,解决方案要容易得多......只需创建SQL脚本在引用表格时始终指定架构:< / p>

CREATE TABLE "my_schema"."my_table" (...); COPY "my_schema"."my_table" (...) FROM stdin;

这种方式使用psql -f xxxxx非常有效,并且您不需要更改search_paths也不需要使用中间文件(并且不会遇到扩展架构问题)。