python 在使用 Sql Server 的 fast_executemany 作为 TRUE 时崩溃

Posted

技术标签:

【中文标题】python 在使用 Sql Server 的 fast_executemany 作为 TRUE 时崩溃【英文标题】:python is crashed while using fast_executemany as TRUE with Sql Server 【发布时间】:2019-07-30 10:45:45 【问题描述】:

我正在尝试将数据从 SourceDB 导入 TargetDB。各个表中只有 15000 行,并且 fast_executemany 为 False 大约需要 20 分钟

但是当我将 fast_executemany 设置为 true 时,我的 python 解释器在 cursorTarget.executemany(SQL1, data) 处崩溃

def ImportFunction(TargetServer,TargetDB,TargetTable,SourceServer,SourceDB,SourceTable,SQL,TCID) :
connectionStringSource = 'DRIVER=SQL Server Native Client 11.0;SERVER='+SourceServer+';DATABASE='+SourceDB+';Trusted_Connection=yes;'
connectionStringTarget = 'DRIVER=SQL Server Native Client 11.0;SERVER='+TargetServer+';DATABASE='+TargetDB+';Trusted_Connection=yes;'
connectionSource = pyodbc.connect(connectionStringSource)
connectionTarget = pyodbc.connect(connectionStringTarget)
cursorSource = connectionSource.cursor()
cursorTarget = connectionTarget.cursor()   
cursorSource.execute(SQL)
rowspart = []
while True :
    itrcount = 1
    rowspart = cursorSource.fetchmany(100)
    if not rowspart :
        break
        #break while loop
    data = rowspart
    connectionSource1 = pyodbc.connect(connectionStringSource)
    cursorSource1 = connectionSource1.cursor()
    rest = cursorSource1.execute("SELECT * FROM "+SourceTable+" WHERE 1=0")
    columnList = [tuple[0] for tuple in rest.description]
    String = ','.join(str(e) for e in columnList)
    StringSQL = "?, " * (len(columnList)-1)
    StringSQL = StringSQL+"?"
    StringSQL = " ) VALUES("+StringSQL+ ")"
    SQL1 = "insert into " + TargetTable + " ( "+ String + StringSQL
    if len(rowspart) > 50 :
        cursorTarget.fast_executemany = True 
    else :
        cursorTarget.fast_executemany = False
    try:
        cursorTarget.executemany(SQL1, data)
    except Exception as e:
        print 'error: ' + str(e)
        #break
    itrcount = itrcount + 1
    del rowspart[:]
    cursorSource1.close()
    del cursorSource1
    connectionSource1.close()

connectionTarget.commit()
cursorSource.close()
del cursorSource
connectionSource.close()
cursorTarget.close()
del cursorTarget
connectionTarget.close()

【问题讨论】:

您使用的是最新版本的pyodbc(目前是4.0.26)吗?如果没有,请更新到最新版本,看看是否有帮助。 【参考方案1】:

该问题仍在调查中。同时,您可以继续使用更新的 ODBC 驱动程序,例如 DRIVER=ODBC Driver 13 for SQL Server,并且 运行 pip install pyodbc==4.0.22 以使用早期版本的 pyodbc。

【讨论】:

以上是关于python 在使用 Sql Server 的 fast_executemany 作为 TRUE 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 F# 中的类型提供程序连接到 SQL Server Compact Edition 4.0?

Python和SQL Server 2017的强大功能

在 MS SQL Server 2008 的 Pivot 中计算水平总计

翻译:Python和SQL Server 2017的强大功能

Python和SQL Server 2017的强大功能

Python和SQL Server 2017的强大功能