【问题标题】:execute sql statements read from a file执行从文件中读取的 sql 语句
【发布时间】:2013-09-10 11:25:43
【问题描述】:

我想加载包含大量 sql 查询(插入)的文本文件并使用 Python(PYODBC) 执行它

我当前的代码如下:

cursor = cnxn.cursor()
with open('C:\Python_Script_Test\INSERTS.txt','r') as file:
    var1 = file.read().replace("\r\n","")
var2 = var1

cursor.execute(var2)
file.close()

该文件中有超过 5000 行,其中的示例 INSERT 如下所示:

Insert into x (q, w, e, r, t, y, u, i, o, p, a, s, d, f, g, h, j)
  VALUES (582, 'GA26', 'TMO ', 'xxx', 'xxx@example.com', '', 'NULL', 'NULL', 
  '', '', '', '', '', '', '', '', NULL);

错误:

pyodbc.ProgrammingError: ('42000', 
  "[42000] [MySQL][ODBC 3.51 Driver][mysqld-5.6.13]
  You have an error in your SQL syntax; check the manual that corresponds to 
  your MySQL server version for the right syntax to use near 
  'insert into x
   (z, b, c, d, e' at line 3 (1064) (SQLExecDirectW)")

编辑:

另一个想法:

好的,目前没有错误。当前代码如下所示: 上一个 = '' 对于 open('C:\Python_Script_Test\x.txt','r') 中的 sql_insert: y = sql_insert.strip().replace("\r\n",";")
如果 y.startswith('insert'):
打印上一个 如果 previous.endswith(';'): 打印'测试\r\n' cursor.execute(上一个)
上一个 = y
别的: 前一个 += y

但是,数据库中的表没有变化...

【问题讨论】:

  • 文本文件中显示的示例行在VALUES 之前缺少一个右括号。从那里开始。
  • 好像您在第 3 行的 INSERTS.txt 文件中有错误。
  • 对了,为什么要通过Python?通常,您可以通过数据库命令行将一个包含 SQL 命令的文本文件直接插入到数据库中。
  • @Jite,这是复制粘贴错误,通常我的代码上有 '('。
  • @Evert,是的,我知道,但我必须这样做。

标签: python mysql sql insert pyodbc


【解决方案1】:

我知道您必须使用 Python,但不清楚您是否必须一次执行整个文件。由于您的输入文件已经分为几行,那么:

cursor = cnxn.cursor()
with open('C:\Python_Script_Test\INSERTS.txt','r') as inserts:
    for statement in inserts:
        cursor.execute(statement)

另外,在 Python 中使用 file 作为变量名是个坏主意,因为它会覆盖 file() 内置函数。

【讨论】:

    【解决方案2】:

    您似乎忘记在jVALUES 之间关闭)

    首先尝试使用供应商提供的专用 SQL 编辑器执行该行。

    我不确定 MySQL ODBC 是否能够一次执行许多语句。如果没有,那么您将不得不解析输入文件。如果每个INSERT 都在单独的文件中,这很容易:

    for line in open(...):
        sql_insert = line.strip()
        if sql_insert:
            cursor.execute(sql_insert)
    

    如果不是,那么您必须以其他方式解析它。也许使用); 将其拆分为语句。这取决于您的输入文件。

    【讨论】:

    • pyodbc.Error: ('HY000', '[HY000] [MySQL][ODBC 3.51 Driver][mysqld-5.6.13]查询为空 (1065) (SQLExecDirectW)') :/
    • 好的。删除已编辑代码中的空行。当然你也可以检查line是否真的是INSERT:if sql_insert.startswith('Insert'):(注意字母大小写)
    • 你能用 MySQL 工具执行单行吗?
    • 是的。看看我的第一篇文章,我还有一个想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多