簡體   English   中英

Psycopg2 “無法執行空查詢”

[英]Psycopg2 “Can't execute an empty query”

我將一些查詢保存在單個.sql腳本中,而不是直接將它們寫入.py腳本中的變量中。

Now I want to read this sql script using Python, split each sql statement by semicolon and then pass each of these scripts to Psycopg2 cursor for sequential execution.

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()

誰能幫我解決這個問題?

當您將 sql 文件拆分為; ,創建的列表將有空字符串作為最后一個元素,它將無法作為有效查詢執行。 為了避免這種情況,讓文件中的所有 sql 都有; 最后,嘗試以下操作:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM