Psycopg2 "Невозможно выполнить пустой запрос" - PullRequest
0 голосов
/ 04 апреля 2020

Я сохранил некоторые запросы в одном скрипте . sql, вместо того, чтобы писать их непосредственно внутри переменных в скрипте .py .

Теперь я хочу Чтобы прочитать этот сценарий sql, используя Python, разделите каждый оператор sql на точки с запятой, а затем передайте каждый из этих сценариев курсору Psycopg2 для последовательного выполнения.

Кажется, что сценарий python читает файл правильно, но при попытке выполнить операторы выдается ошибка «не удается выполнить пустой запрос».

Возможно, выгода заключается в том, что в этом сценарии sql разбросано много разрывов строк. Заявления в нем написаны так:

DROP TABLE IF EXISTS
    target_schema.some_table
;

SELECT
    column
FROM
    schema.table
;

Вот код python:

import psycopg2
import pathlib

conn = psycopg2.connect(
     user=user
    ,password=password
    ,host=host
    ,port=port
    ,database=database
)

pg_cursor = conn.cursor()

scriptContents = Path('my_folder\my_sql_script.sql').read_text(encoding='utf-8')

sqlStatements = scriptContents.split(sep=';')

for statement in sqlStatements:    

    try:
        pg_cursor.execute(f'{statement}')
        conn.commit()
    except psycopg2.Error as errorMsg:
        print(errorMsg)        
        conn.rollback()

Может ли кто-нибудь помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 04 апреля 2020

Когда вы разбиваете файл sql на ;, созданный список будет содержать пустую строку в качестве последнего элемента и не сможет быть выполнен как действительный запрос. Чтобы избежать этого, учитывая, что все sqls в ваших файлах имеют ; в конце, попробуйте следующее:

for statement in sqlStatements[:-1]:
# it will slice out the last element of your sqlStatements list
    try:
        pg_cursor.execute(f'{statement}')
        conn.commit()
    except psycopg2.Error as errorMsg:
        print(errorMsg)        
        conn.rollback()

Другое решение - написать ваши операторы новой строкой, а затем прочитать их один за другим один следующим образом:

my_sql_script. sql:

DROP TABLE IF EXISTS target_schema.some_table
SELECT column FROM schema.table

, чтобы запустить операторы, используйте:

with open('my_folder\my_sql_script.sql','r', encoding='utf-8') as f:
    for statement in f.readlines():    
        try:
            pg_cursor.execute(f'{statement.rstrip()}')
            conn.commit()
        except psycopg2.Error as errorMsg:
            print(errorMsg)        
            conn.rollback()

...