Python PostgreSQL Заявление Проблема psycopg2 cursor.execute (Table Union)

1

Я новичок в 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()

Если мы печатаем инструкцию SQL, это результирующий запрос:

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 заранее за помощь

Теги:
psycopg2
postgis

3 ответа

1

Действительно, Питер, похоже, так. Более конкретно, каждое выражение SQL должно передаваться отдельно через:

curs.execute(SQLStatement)

и они передаются через:

conn.commit()

Все изменения будут очевидны в базе данных.

Thanx снова

1

SQL, который вы отправляете, на самом деле составляет 3 оператора, а не 1.

Я никогда не пробовал этого, но я ожидаю, что казнь будет жаловаться на это.

Кроме того, в инструкции ALTER TABLE отсутствует точка с запятой.

Я бы рекомендовал добавить обработку исключений в ваш код и выполнить каждый SQL-запрос отдельно, чтобы вы улучшили отчет об ошибках в отношении того, что может пойти не так.

  • 0
    На самом деле, похоже, это так :)
0

Как уже упоминалось, индивидуальное выполнение каждого оператора и проверка исключения могут дать хорошее представление о том, что происходит.

В частности, 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 выполнит любые проверки работоспособности только для ввода строки!

Я предлагаю (за исключением особых редких обстоятельств) выполнять каждое выражение отдельно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню