Я новичок в python и использую Python и PostgreSQL (9.03) (и psycopg2 для взаимодействия между ними) в среде Windows XP. Я работаю над огромным набором данных сети дорожного набора данных и разделяю данные по каждой стране с помощью геообработки ArcGIS и автоматически сохраняю их в базе данных PostGIS (1.5). Хотя при извлечении значений из базы данных все работает так, как планировалось:
... пытаться: conn = psycopg2.connect( "host = '" + HostName + "' dbname = '" + DBName + "' user = '" + Username + "' password = '" + Password + "'" ) curs = conn.cursor() Кроме: print "Не удается подключиться к базе данных"
SQLStatement = "SELECT data_partition FROM наборы данных 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()
print SQLStatement
CREATE TABLE compressdata.FRA24_Lines_2011_03 AS SELECT * FROM compressdata.FRA24_Lines_2011_03_Net0 UNION SELECT * FROM compressdata.FRA24_Lines_2011_03_Net1 UNION SELECT * FROM compressdata.FRA24_Lines_2011_03_Net2 UNION SELECT * FROM compressdata.FRA24_Lines_2011_03_Net3 UNION SELECT * FROM compressdata.FRA24_Lines_2011_03_Net4 UNION SELECT * FROM compressdata.FRA24_Lines_2011_03_Net5;
ALTER TABLE compressdata.FRA24_Lines_2011_03
DROP COLUMN gid;
Я использую переменные в слиянии разных классов дорожной сети и из-за разных разделов моего набора данных, мне нужно прокручивать их, но по какой-то причине я еще не могу понять, что никакой таблицы не создается.
Любые идеи?
Thanx заранее за помощь
Действительно, Питер, похоже, так. Более конкретно, каждое выражение SQL должно передаваться отдельно через:
curs.execute(SQLStatement)
и они передаются через:
conn.commit()
Все изменения будут очевидны в базе данных.
Thanx снова
SQL, который вы отправляете, на самом деле составляет 3 оператора, а не 1.
Я никогда не пробовал этого, но я ожидаю, что казнь будет жаловаться на это.
Кроме того, в инструкции ALTER TABLE отсутствует точка с запятой.
Я бы рекомендовал добавить обработку исключений в ваш код и выполнить каждый SQL-запрос отдельно, чтобы вы улучшили отчет об ошибках в отношении того, что может пойти не так.
Как уже упоминалось, индивидуальное выполнение каждого оператора и проверка исключения могут дать хорошее представление о том, что происходит.
В частности, psycopg2 будет поднимать psycopg2.ProgrammingError. Если сообщение об ошибке не является полезным, вам может быть лучше удалиться об ошибке pgcode и затем изучить это. PGCodes для 9.1: 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
ПРИМЕЧАНИЕ. Оператор execute cursors может принимать несколько операторов sql в одной строке.
ex: cur.execute('create table ABBA (); create table BETA ();')
является совершенно законным утверждением.
По этой причине не ожидайте, что курсор .execute выполнит любые проверки работоспособности только для ввода строки!
Я предлагаю (за исключением особых редких обстоятельств) выполнять каждое выражение отдельно.