我是python的新手,使用Python&在Windows XP环境中使用PostgreSQL(9.03)(以及两者之间的psycopg2接口)。 我正在研究一个巨大的空间数据集道路网络数据集,并通过ArcGIS地理处理将每个国家的数据分开,并自动将它们存储在PostGIS(1.5)数据库中。 在从数据库中检索值时,一切都按计划进行:
... 尝试: conn = psycopg2.connect(“host ='”+ HostName +“'dbname ='”+ DBName +“'user ='”+ Username +“'password ='”+ Password +“'”) curs = conn.cursor() 除了: 打印“无法连接到数据库”
SQLStatement =“SELECT data_partition FROM datasets WHERE map_partition ='”+ MapPartitions [0] +“'” curs.execute(的SQLStatement) ...
当我尝试将以下Union语句传递给Postgres时,没有结果表,而如果我将打印的SQL语句作为SQL语句运行并运行它PostgresSQL,它会创建所需的结果表:
conn = psycopg2.connect(“host ='”+ HostName +“'dbname ='”+ DBName +“'user ='”+ Username +“'password ='”+ Password +“'”) cur = conn.cursor()
SQLStatement =(
"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()
打印SQLStatement
CREATE TABLE compresseddata.FRA24_Lines_2011_03 AS SELECT * FROM compresseddata.FRA24_Lines_2011_03_Net0 UNION SELECT * FROM compresseddata.FRA24_Lines_2011_03_Net1 UNION SELECT * FROM compresseddata.FRA24_Lines_2011_03_Net2 UNION SELECT * FROM compresseddata.FRA24_Lines_2011_03_Net3 UNION SELECT * FROM compresseddata.FRA24_Lines_2011_03_Net4 UNION SELECT * FROM compresseddata.FRA24_Lines_2011_03_Net5;
ALTER TABLE compresseddata.FRA24_Lines_2011_03
DROP COLUMN gid;
我在合并不同的道路网络类中使用变量,并且由于我的数据集的不同分区,我需要迭代它们,但由于某些原因我仍然无法理解,因此没有生成表格。
有什么想法吗?
Thanx事先提供帮助
答案 0 :(得分:1)
您发送的SQL实际上是3个语句,而不是1个。
我从未尝试过这个,但我希望执行抱怨这个。
此外,ALTER TABLE语句中缺少分号。
我建议添加exception handling to your code并分别执行每个SQL语句,以便更好地报告可能出错的错误。
答案 1 :(得分:1)
curs.execute(SQLStatement)
他们通过以下方式提交:
conn.commit()
所有更改都将在数据库中显现。
再次Thanx
答案 2 :(得分:0)
如前所述,单独执行每个语句并检查异常可以很好地了解正在发生的事情。
特别是psycopg2会引发psycopg2.ProgrammingError。如果错误消息没用,您可能会更好地查找异常的pgcode,然后再进行调查。 适用于9.1的PGCodes: 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
注意:游标执行语句CAN可以在一个字符串中使用多个sql语句。
例如:cur.execute('create table ABBA (); create table BETA ();')
是完全合法的陈述。
出于这个原因,不要指望cursor.execute只对字符串输入执行任何健全性检查!
我建议(除特殊情况外)单独执行每个语句。