为了账号安全,请及时绑定邮箱和手机立即绑定

Psycopg2 “无法执行空查询”

Psycopg2 “无法执行空查询”

婷婷同学_ 2022-09-27 15:10:50
我将一些查询保存在单个.sql脚本中,而不是直接将它们写入.py脚本中的变量中。现在我想使用Python阅读这个sql脚本,用分号拆分每个sql语句,然后将每个脚本传递给Psycopg2游标进行顺序执行。python 脚本似乎正确读取了文件,但是当我尝试执行语句时,会引发“无法执行空查询”错误。也许问题是:在这个sql脚本中有许多换行符。其中的语句写如下:DROP TABLE IF EXISTS    target_schema.some_table;SELECT    columnFROM    schema.table;下面是蟒蛇代码:import psycopg2import pathlibconn = 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 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

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


查看完整回答
反对 回复 2022-09-27
  • 1 回答
  • 0 关注
  • 57 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信