我对我的数据库运行脚本,就像这样...
psql -d myDataBase -a -f myInsertFile.sql
字符串唯一的问题是,我希望能够在这个命令中指定运行脚本的模式。我可以调用set search_path='my_schema_01',但文件应该是可移植的。我如何才能做到这一点?
slwdgvem1#
您可以创建一个包含set schema ...语句的文件,然后包含要运行的实际文件:创建一个文件run_insert.sql:
set schema ...
run_insert.sql
set schema 'my_schema_01'; \i myInsertFile.sql
字符串然后调用它使用:
psql -d myDataBase -a -f run_insert.sql
型
rjee0c152#
更通用的方法是设置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
set schema myschema
3yhwsihp3#
主要示例
下面的示例将使用模式 myschema 在数据库 mydatabase 上运行 * myfile.sql *。
psql "dbname=mydatabase options=--search_path=myschema" -a -f myfile.sql
字符串psql命令的第一个参数是 dbname 参数。文档中提到可以提供连接字符串。如果此参数包含=符号或以有效的URI前缀(postgresql://或postgres://)开头,则将其视为conninfo字符串dbname关键字指定要连接的数据库,options关键字允许您指定在连接启动时发送到服务器的命令行选项。这些选项在server configuration chapter中有详细说明。我们用于选择模式的选项是search_path。
其他例子
下面的示例将使用模式 myschema 连接到数据库 mydatabase 上的主机 myhost。=特殊字符必须使用转义序列%3D进行url转义。
=
%3D
psql postgres://myuser@myhost?options=--search_path%3Dmyschema
wz8daaqr4#
可以使用PGOPTIONS环境变量以灵活的方式实现这一点。在Unix shell中:
PGOPTIONS
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应该同样工作。
set PGOPTIONS=value
cunj1qz15#
我正在使用这样的东西,效果很好:*:-)
(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中也可能有这样做的方法。
lh80um4z6#
这对我来说很有效:
psql postgresql://myuser:password@myhost/my_db -f myInsertFile.sql
kcrjzv8t7#
在我的例子中,我想动态地将模式添加到一个文件中,这样无论用户从SQL中提供什么模式名称,我都将使用所提供的模式名称运行SQL文件。为此,我替换了SQL文件中的一些文本。首先,我在文件中添加了{{schema}},如下所示
{{schema}}
CREATE OR REPLACE FUNCTION {{schema}}.usp_dailygaintablereportdata(
字符串然后在sed命令的帮助下,使用用户提供的模式名称动态替换{{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
型首先替换完成,然后运行目标文件,然后再次恢复替换
mpbci0fu8#
我在尝试对中间模式进行一些数据导入时也遇到了类似的问题(稍后我们将转到最终模式)。由于我们依赖于扩展(例如PostGIS),“run_insert”sql文件并没有完全解决这个问题。过了一段时间,我们发现至少在Postgres 9.3中,解决方案要容易得多.只需创建SQL脚本在访问表时始终指定模式:第一个月这样使用psql -f xxxxx就可以完美地工作,您不需要更改search_paths,也不需要使用中间文件(并且不会遇到扩展模式问题)。
psql -f xxxxx
8条答案
按热度按时间slwdgvem1#
您可以创建一个包含
set schema ...
语句的文件,然后包含要运行的实际文件:创建一个文件
run_insert.sql
:字符串
然后调用它使用:
型
rjee0c152#
更通用的方法是设置search_path(应该在PostgreSQL 7.x及以上版本中工作):
字符串
请注意,
set schema myschema
是上述命令的别名,在8.x中**不可用。标签:http://www.postgresql.org/docs/9.3/static/ddl-schemas.html
3yhwsihp3#
主要示例
下面的示例将使用模式 myschema 在数据库 mydatabase 上运行 * myfile.sql *。
字符串
psql命令的第一个参数是 dbname 参数。文档中提到可以提供连接字符串。
如果此参数包含=符号或以有效的URI前缀(postgresql://或postgres://)开头,则将其视为conninfo字符串
dbname关键字指定要连接的数据库,options关键字允许您指定在连接启动时发送到服务器的命令行选项。这些选项在server configuration chapter中有详细说明。我们用于选择模式的选项是search_path。
其他例子
下面的示例将使用模式 myschema 连接到数据库 mydatabase 上的主机 myhost。
=
特殊字符必须使用转义序列%3D
进行url转义。型
wz8daaqr4#
可以使用
PGOPTIONS
环境变量以灵活的方式实现这一点。在Unix shell中:
字符串
如果脚本或子shell中有多个调用需要相同的选项,那么只设置一次
PGOPTIONS
并将其导出会更简单。型
或从外部调用设置了
PGOPTIONS
的顶级shell脚本型
在Windows CMD环境中,
set PGOPTIONS=value
应该同样工作。cunj1qz15#
我正在使用这样的东西,效果很好:*:-)
字符串
**注意:**仅适用于Linux/Mac/Bash,不过在Windows/PowerShell中也可能有这样做的方法。
lh80um4z6#
这对我来说很有效:
字符串
kcrjzv8t7#
在我的例子中,我想动态地将模式添加到一个文件中,这样无论用户从SQL中提供什么模式名称,我都将使用所提供的模式名称运行SQL文件。为此,我替换了SQL文件中的一些文本。首先,我在文件中添加了
{{schema}}
,如下所示字符串
然后在
sed
命令的帮助下,使用用户提供的模式名称动态替换{{schema}}
型
首先替换完成,然后运行目标文件,然后再次恢复替换
mpbci0fu8#
我在尝试对中间模式进行一些数据导入时也遇到了类似的问题(稍后我们将转到最终模式)。由于我们依赖于扩展(例如PostGIS),“run_insert”sql文件并没有完全解决这个问题。
过了一段时间,我们发现至少在Postgres 9.3中,解决方案要容易得多.只需创建SQL脚本在访问表时始终指定模式:
第一个月
这样使用
psql -f xxxxx
就可以完美地工作,您不需要更改search_paths,也不需要使用中间文件(并且不会遇到扩展模式问题)。