为什么使用 fast_executemany=True 调用 cursor.executemany() 会导致分段错误?
Why is calling cursor.executemany() with fast_executemany=True resulting in a segmentation fault?
我有一个连接到 Azure SQL 数据库的 pydodbc 游标,在 Mac OS Sierra 10.12.6 上安装了最新版本的 FreeTDS 运行:
cursor.execute("CREATE TABLE test(a INT, b INT)")
cursor.commit()
这个可以,很好,那我试试
cursor.fast_executemany=True
cursor.execute("INSERT INTO test(a, b) VALUES(?,?)", [(1,2),(3,4),(5,6)])
这会导致分段错误,我看到的唯一错误消息是 segmentation fault: 11
如果我不设置 cursor.fast_executemany=True
,那么代码就可以正常工作。
我能够使用 FreeTDS 1.00.94 和 unixODBC 2.3.6 在 Xubuntu 16.04 下重现您的 "segmentation fault" 问题。
fast_executemany = True
使用名为 "parameter arrays" 的 ODBC 功能,并非所有 ODBC 驱动程序都支持该功能。显然 FreeTDS ODBC 是不支持它的驱动程序之一。
如果你真的需要使用fast_executemany = True
,你可以使用Microsoft's ODBC Driver for SQL Server。它确实支持 ODBC 参数数组。
我有一个连接到 Azure SQL 数据库的 pydodbc 游标,在 Mac OS Sierra 10.12.6 上安装了最新版本的 FreeTDS 运行:
cursor.execute("CREATE TABLE test(a INT, b INT)")
cursor.commit()
这个可以,很好,那我试试
cursor.fast_executemany=True
cursor.execute("INSERT INTO test(a, b) VALUES(?,?)", [(1,2),(3,4),(5,6)])
这会导致分段错误,我看到的唯一错误消息是 segmentation fault: 11
如果我不设置 cursor.fast_executemany=True
,那么代码就可以正常工作。
我能够使用 FreeTDS 1.00.94 和 unixODBC 2.3.6 在 Xubuntu 16.04 下重现您的 "segmentation fault" 问题。
fast_executemany = True
使用名为 "parameter arrays" 的 ODBC 功能,并非所有 ODBC 驱动程序都支持该功能。显然 FreeTDS ODBC 是不支持它的驱动程序之一。
如果你真的需要使用fast_executemany = True
,你可以使用Microsoft's ODBC Driver for SQL Server。它确实支持 ODBC 参数数组。