【问题标题】:jaydebeapi set autocommit off for bulk insertsjaydebeapi 为批量插入设置自动提交关闭
【发布时间】:2017-06-05 01:20:13
【问题描述】:

我有很多行要插入到一个表中,并尝试逐行进行,但这需要很长时间。我阅读了此链接Python+MySQL - Bulk Insert,似乎将自动提交设置为关闭可以加快速度。

import jadebeapi

connection = jaydebeapi.connect('com.teradata.jdbc.TeraDriver', ['jdbc:teradata://some url',USER,PASS], ['tdgssconfig.jar','terajdbc4.jar'],) 


cur = connection.cursor()
connection.jconn.setAutoCommit(False)
cur.execute('select * from my_table')
connection.commit()

我执行的其他查询是:

l = [(1,2,3),(2,4,6).....]
for tup in l:
    cur.execute('my insert statement')
#this is the really slow part.

当我有connection.jconn.setAutoCommit(False) 时,我总是收到这个错误:

[Teradata Database] [TeraJDBC 15.10.00.14] [Error 3932] [SQLState 25000] Only an ET or null statement is legal after a DDL Statement.

当该行和connection.commit() 被注释掉时,代码可以正常工作。将自动提交设置为 false 的正确语法是什么?

【问题讨论】:

  • 谷歌搜索将我带到a Teradata documentation。不确定这是否对您有帮助。
  • 关于性能:批量插入可以提供帮助。但是 CPython 上使用的 JayDeBeApi 有一些 Py2Java 开销。试试 Jython+JayDeBeApi 或直接使用 Java。

标签: python mysql-python jaydebeapi


【解决方案1】:

如果速度/效率是一个问题,您应该使用准备好的语句并将您的参数作为第二个参数传递。

你也可以使用.executemany():

l = [(1,2,3),(2,4,6).....]
cur.executemany('my insert statement with 3 ? params', l)
#this should be much faster

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多