Python PostgreSQL 语句问题 psycopg2 cursor.execute(Table Union)
Posted
技术标签:
【中文标题】Python PostgreSQL 语句问题 psycopg2 cursor.execute(Table Union)【英文标题】:Python PostgreSQL Statement Problem psycopg2 cursor.execute(Table Union) 【发布时间】:2011-09-09 04:38:15 【问题描述】:我是 python 新手,在 Windows XP 环境中使用 Python 和 PostgreSQL (9.03)(以及 psycopg2 在两者之间进行接口)。 我正在研究一个巨大的空间数据集道路网络数据集,并通过 ArcGIS 地理处理分离每个国家/地区的数据,并自动将它们存储在 PostGIS (1.5) 数据库中。 当从数据库中检索值时,一切都按计划进行:
... 尝试: conn = psycopg2.connect("host = '" + HostName + "' dbname='" + DBName + "' user='" + Username + "'password='" + Password + "'") curs = conn.cursor() 除了: print "无法连接数据库"
SQLStatement = "SELECT data_partition FROM datasets WHERE map_partition='" + MapPartitions[0] + "'" curs.execute(SQL 语句) ...
当我尝试将以下联合语句传递给 Postgres 时,没有结果表,而如果我将打印的 SQL 语句作为 SQL 语句运行并运行 PostgresSQL,它会创建所需的结果表:
conn = psycopg2.connect("host = '" + HostName + "' dbname='" + DBName + "' user='" + Username + "'password='" + Password + "'") cur = conn.cursor()
SQL 语句 = (
"CREATE TABLE " + Schema + "." + PartitionTableName + " AS \n"
"SELECT * FROM " + Schema + "." + partName + "_Lines_" + Rel + "_Net0 UNION \n"
"SELECT * FROM " + Schema + "." + partName + "_Lines_" + Rel + "_Net1 UNION \n"
"SELECT * FROM " + Schema + "." + partName + "_Lines_" + Rel + "_Net2 UNION \n"
"SELECT * FROM " + Schema + "." + partName + "_Lines_" + Rel + "_Net3 UNION \n"
"SELECT * FROM " + Schema + "." + partName + "_Lines_" + Rel + "_Net4 UNION \n"
"SELECT * FROM " + Schema + "." + partName + "_Lines_" + Rel + "_Net5;\n"
"\n"
"\n"
"ALTER TABLE " + Schema + "." + partName + "_Lines_" + Rel + "\n"
"DROP COLUMN gid;\n"
cur.execute(SQLStatement)
conn.commit()
cur.close()
如果我们打印 SQL 语句,这是结果查询:
打印 SQL 语句
创建表压缩数据.FRA24_Lines_2011_03 AS 选择 * FROM 压缩数据.FRA24_Lines_2011_03_Net0 UNION 选择 * FROM 压缩数据.FRA24_Lines_2011_03_Net1 UNION 选择 * FROM 压缩数据.FRA24_Lines_2011_03_Net2 UNION SELECT * FROM compresseddata.FRA24_Lines_2011_03_Net3 UNION 选择 * FROM 压缩数据.FRA24_Lines_2011_03_Net4 UNION SELECT * FROMcompresseddata.FRA24_Lines_2011_03_Net5;
ALTER TABLE 压缩数据.FRA24_Lines_2011_03
删除列 gid;
我在合并不同的道路网络类中使用变量,并且由于我的数据集的不同分区,我需要遍历它们,但由于某种我仍然无法理解的原因,没有生成表。
有什么想法吗?
提前感谢您的帮助
【问题讨论】:
【参考方案1】:您发送的 SQL 实际上是 3 个语句,而不是 1 个。
我从未尝试过,但我希望执行会抱怨这个。
另外,ALTER TABLE 语句中缺少分号。
我建议添加 exception handling to your code 并分别执行每个 SQL 语句,以便更好地报告可能出错的错误。
【讨论】:
确实是这样 :)【参考方案2】:确实,彼得,情况似乎如此。 更具体地说,每个 SQL 语句必须分别通过:
curs.execute(SQLStatement)
他们通过以下方式提交:
conn.commit()
所有更改都将在数据库中显示。
再次感谢
【讨论】:
【参考方案3】:如前所述,单独执行每个语句并检查异常可以很好地了解正在发生的事情。
特别是 psycopg2 会引发 psycopg2.ProgrammingError。如果错误消息没有用,您可能会更幸运地查找异常的 pgcode,然后对其进行调查。 9.1 的 PG 代码: http://www.postgresql.org/docs/9.1/static/errcodes-appendix.html)。
try:
cur.execute(SQLQUERY)
except psycopg2.ProgrammingError as e:
# Err code lookup at http://www.postgresql.org/docs/9.1/static/errcodes-appendix.html
print "psycopg2 error code %s" % e.pgcode
raise e
注意:游标执行语句可以在单个字符串中使用多个 sql 语句。
例如:cur.execute('create table ABBA (); create table BETA ();')
是完全合法的声明。
出于这个原因,不要期望 cursor.execute 对仅输入的字符串执行任何完整性检查!
我建议(除了特殊的罕见情况)单独执行每个语句。
【讨论】:
以上是关于Python PostgreSQL 语句问题 psycopg2 cursor.execute(Table Union)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中将(有些复杂的)Postgresql 语句转换为 SQLAlchemy ORM?
CentOS 7 安装&配置PostgreSQL 12(附图片详解)