【问题标题】:Python SQL Single Commit vs Multiple Commit In WithPython SQL 单次提交与多次提交
【发布时间】:2017-04-18 12:45:50
【问题描述】:

我是 Python 新手,所以我一直在根据我发现的内容编写脚本,并且进展顺利(也就是说,我的脚本可以正常工作,即使它们不是最优雅或最正确的)。我的最终目标是获取一个 csv,读取它,找到一个阶段,然后如果找到该短语,则将该行写入 SQL 数据库。我有这个工作,但我的问题是:

我应该在with 的每个循环内写一个.execute() 然后.commit()(这就是我现在正在做的)吗?或者我应该构建一个语句并在最后执行/提交(不确定如何执行此操作)?我通读了this post,看到了如何格式化插入,但不确定如何获取我的代码(如下)并调整以构建具有多个值的单个插入。关于第一种方法的任何帮助或建议都很好,或者第二种方法的正确方法会很棒!提前致谢!

背景:我正在使用 pypyodbc 和一个虚拟机。 python 脚本与 SQL Express 数据库位于同一 VM 上。

这是我的代码:

with open(CSVFILE, 'rt', encoding='utf8') as f:
    if debug:
        print('Inside the with')
    reader = csv.reader(f, delimiter=',')
    columns = next(reader)
    query = 'insert into TABLENAME ({0}) values ({1})'
    query = query.format(','.join(columns), ','.join('?' * len(columns)))
    for row in reader:
         for field in row:
             if data.strSearch in field:
                 if debug:
                     print('Found: {}'.format(row[0]))
                 cursor.execute(query, row)
                 cursor.commit()

【问题讨论】:

  • 您可以改为将每个循环上的每个感兴趣的row 附加到另一个列表,以提供嵌套列表。完成所有循环后,您可以调用 executemany() 并传递 list_of_rows 而不是 execute() 以一次性插入记录,然后 commit() 进行更改。但是 commit() 现在对于内部循环的每次迭代并不是绝对必要的,并且会增加运行时间。

标签: python sql insert pypyodbc


【解决方案1】:

您的操作方式看起来不错,尽管您可以.commit() 移到循环之外,因此您最后只执行一次提交。那可能会快一点。

关于将行添加到列表然后使用.executemany 的建议,这种方法几乎总是会导致单独的 INSERT 语句被发送到服务器,因此它可能不会比移动在循环之外提交。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多