【发布时间】:2019-01-14 21:29:13
【问题描述】:
我正在尝试执行两个 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
我意识到它失败了,因为第一个命令没有被提交,所以为了解决这个问题,我尝试设置自动提交模式,并用“开始/结束”块包装语句,但这没有帮助。
当我使用 psql CLI 并运行以下命令时,一切都按预期工作(没有“模式不存在”错误,并且在回滚后,模式和表都消失了):
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
我的问题是:
用“psql -c”和“psql -f”执行查询有什么区别?
如何使用 python 以编程方式实现相同的结果?
非常感谢!
【问题讨论】:
标签: sql amazon-redshift psycopg2 psql pyodbc