执行多个查询时,"psql -c"和"psql -f"有什么区别?



我正在尝试执行两个sql命令(创建一个新的模式和表),如果执行失败,可以回滚这两个命令。我连接的数据库是AWS Redshift。

create schema if not exists test_schema;
create table test_schema.test_table as select 1;

最初,我试图用python程序化地执行这些命令,同时使用psycopg2和pyodbc,结果出现了以下错误:

ERROR:  schema "test_schema" does not exist

我意识到它失败是因为第一个命令没有被调试,所以为了解决这个问题,我尝试设置自动提交模式,并用"begin/end"块包装语句,但无济于事。

当我使用psqlCLI并运行以下操作时,一切都按预期进行(没有"schema不存在"错误,回滚后,schema和表都不见了):

dev=# begin;
BEGIN
dev=# create schema test_schema;
CREATE SCHEMA
dev=# create table test_schema.test_table as select 1;
SELECT
dev=# rollback;
ROLLBACK

我试图通过在命令行中运行以下命令来获得相同的结果:

psql -c "begin; create schema test_schema; create table test_schema.test_table as select 1;"

这导致了相同的错误:

ERROR: schema "test_schema" does not exist

然而,当我把上面的代码放在一个文件中并运行相同的命令时,这次使用-f,它起了作用:

psql -f create_schema_and_table.sql

我的问题是:

  1. 使用"psql-c"one_answers"psql-f"执行查询有什么区别?

  2. 使用python,如何通过程序实现相同的结果?

非常感谢!

我不知道你做错了什么,你的"psql-c"命令运行得很好:

ads@diamond:~$ psql -c "begin; create schema test_schema; create table test_schema.test_table as select 1;" postgres
SELECT 1

psql将把整个字符串发送到服务器,并在一个事务中执行它。您的问题是使用"begin"启动事务,但从不提交它。因此,在psql运行结束时,所有更改都会回滚。下一个psql命令将找不到架构,也找不到表。但是,只要所有内容都停留在一个psql调用中,同一命令中的后续查询就可以看到新创建的对象。

您的查询字符串应该看起来像:

begin; create schema test_schema; create table test_schema.test_table as select 1; commit;

或者,更简单:

create schema test_schema; create table test_schema.test_table as select 1;

两者都会起作用。

相关内容

  • 没有找到相关文章

最新更新