Python PostgreSQL Заявление Проблема psycopg2 cursor.execute (Table Union) - PullRequest
1 голос
/ 06 июня 2011

Я новичок в python и использую Python & PostgreSQL (9.03) (и psycopg2 для взаимодействия между ними) в среде Windows XP.Я работаю над огромным пространственным набором данных дорожной сети и разделяю данные по странам с помощью геообработки ArcGIS, и автоматически сохраняю их в базе данных PostGIS (1.5).Хотя при получении значений из базы данных все работает как запланировано:

... try: conn = psycopg2.connect ("host = '" + HostName + "' dbname = '" + DBName + "' user ='"+ Username +"' password = '"+ Password +"' ") curs = conn.cursor () кроме: print" Невозможно подключиться к базе данных "

SQLStatement =" SELECT data_partition FROM наборов данных WHEREmap_partition = '"+ MapPartitions [0] +"' "curs.execute (SQLStatement) ...

Когда я пытаюсь передать следующий оператор объединения в 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, то это результирующий запросy:

print SQLStatement

CREATE TABLE сжатых данных.FRA24_Lines_2011_03 КАК ВЫБРАТЬ * ИЗ СЖИЖЕННЫХ ДАННЫХ.FRA24_Lines_2011_03_Net2 UNION SELECT * FROM сжатых данных.FRA24_Lines_2011_03_Net3 UNION SELECT * FROM сжатых данных.FRA24_Lines_2011_03_Net4 UNION SELECT * FROM сжатых данных.

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

Есть идеи?

Заранее спасибо за помощь

Ответы [ 3 ]

1 голос
/ 07 июня 2011

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

curs.execute(SQLStatement)

и их совершение через:

conn.commit()

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

Спасибо еще раз

1 голос
/ 06 июня 2011

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

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

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

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

0 голосов
/ 15 октября 2013

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

В частности, 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

ПРИМЕЧАНИЕ. Оператор выполнения курсора МОЖЕТ принять несколько операторов SQL в одной строке. пример: cur.execute('create table ABBA (); create table BETA ();') - совершенно законное утверждение. По этой причине не ожидайте, что cursor.execute выполнит какие-либо проверки работоспособности только для ввода строки!

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

...