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(附图片详解)

查询返回语句 - PostgreSQL

postgreSQL 在 select 语句中的 if 语句中声明 var

postgresql解释删除语句

postgresql 错误:由于用户请求而取消语句