Psycopg2 “无法执行空查询”

我将一些查询保存在单个.sql脚本中,而不是直接将它们写入.py脚本中的变量中。


现在我想使用Python阅读这个sql脚本,用分号拆分每个sql语句,然后将每个脚本传递给Psycopg2游标进行顺序执行。


python 脚本似乎正确读取了文件,但是当我尝试执行语句时,会引发“无法执行空查询”错误。


也许问题是:在这个sql脚本中有许多换行符。其中的语句写如下:


DROP TABLE IF EXISTS

    target_schema.some_table

;


SELECT

    column

FROM

    schema.table

;


下面是蟒蛇代码:


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

任何人都可以帮我解决这个问题吗?


婷婷同学_
浏览 58回答 1
1回答

波斯汪

将 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_tableSELECT 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()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python