繁体   English   中英

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

[英]How can I specify the schema to run an sql file against in the Postgresql command line

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

psql -d myDataBase -a -f myInsertFile.sql

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

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

创建一个文件run_insert.sql

set schema 'my_schema_01';
\i myInsertFile.sql

然后使用以下方法调用它:

psql -d myDataBase -a -f run_insert.sql

更通用的方法是设置 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

主要示例

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

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

它的工作方式是psql命令的第一个参数是dbname参数。 文档提到可以提供连接字符串

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

dbname 关键字指定要连接的数据库, options 关键字允许您指定在连接启动时发送到服务器的命令行选项。 这些选项在服务器配置一章中有详细说明。 我们用来选择模式的选项是search_path

另一个例子

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

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

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应该是一样的。

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

(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 中也可能有一种方法可以做到这一点。

这对我有用:

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

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

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

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

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

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

我在尝试对中间模式进行一些 dat 导入时遇到了类似的问题(稍后我们将转到最后一个模式)。 由于我们依赖于扩展(例如 PostGIS)之类的东西,“run_insert”sql 文件并没有完全解决问题。

一段时间后,我们发现至少在 Postgres 9.3 中,解决方案要容易得多……只需创建您的 SQL 脚本,并在引用表时始终指定架构

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

这种使用psql -f xxxxx工作得很好,您不需要更改 search_paths 也不需要使用中间文件(并且不会遇到扩展模式问题)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM