Sql server Linux上的pyodbc fast_ExecuteMy在插入时的字符串

Sql server Linux上的pyodbc fast_ExecuteMy在插入时的字符串,sql-server,python-3.x,pyodbc,executemany,Sql Server,Python 3.x,Pyodbc,Executemany,我有以下代码,在Windows上运行良好,但在Linux上失败: import pyodbc conn = pyodbc.connect(p_str = None, server = ..., app = ..., databsae = ..., driver = '{ODBC Driver 17 for SQL Server}', Trusted_Connection = 'yes') conn.set

我有以下代码,在Windows上运行良好,但在Linux上失败:

import pyodbc

conn = pyodbc.connect(p_str = None, server = ..., app = ..., databsae = ...,
                      driver = '{ODBC Driver 17 for SQL Server}',
                      Trusted_Connection = 'yes')

conn.setdecoding(pyodbc.SQL_CHAR, encoding = 'utf-8')
conn.setdecoding(pyodbc.SQL_WCHAR, encoding = 'utf-8')
conn.setencoding(encoding = 'utf-8')

sql = 'INSERT INTO TestStrTbl(idKey,idValue) VALUES (?,?)'
data = [('one', 'value1'), ('two', 'value2')]

cursor = conn.cursor()
cursor.connection.autocommit = False
cursor.fast_executemany = True
cursor.executemany(sql, data)
cursor.commit()
我正在插入并清空使用以下SQL创建的SQL Server表:

CREATE TABLE TestStrTbl
(
    idKey   varchar(20) NOT NULL PRIMARY KEY,
    idValue varchar(20) NOT NULL
)
返回的错误为:

违反主键约束“PK__TestStrT__3FBEE7404FA9AB3B”。 无法在对象“dbo.TestStrTbl”中插入重复键。复制品 键值为(?)

当我使用相同的连接来读取或插入完整的字符串时,如

sql = "INSERT INTO TestStrTbl(idKey,idValue) VALUES ('%s','%s')"
cursor.connection.autocommit = False
cursor.fast_executemany = True
for row in data:
    cursor.execute(sql % row)
cursor.commit()
这个很好用。另一种可能是让cursor.fast_executemany=False,这样它也可以在Linux上工作。我能做些什么来解决这个问题

我正在Ubuntu Linux上运行Python 3.7.8,其
pyodbc==4.0.24
。 谢谢你的帮助


更新

以下是unixODBC设置:

18:48:56 $> odbcinst -j
unixODBC 2.3.1
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /home/myUserId/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

使用Microsoft的SQL Server ODBC驱动程序时,无需调用
conn.setdecoding
conn.setencoding
。pyodbc的默认编码是UTF16-LE,这是Microsoft的ODBC驱动程序所使用的


至于,版本2.3.5(2018-01-02)之前的任何内容都应被视为“旧版”,因为这是一个主要的错误修复版本。版本2.3.7(2018-08-10)修复了多个错误,目前是推荐的版本。

根据错误消息,
将作为文本字符串传递,而不是替换为参数值。这是ODBC驱动程序正上方的一层,它正在出错,因为T-SQL不接受没有引号的
,所以您必须真正努力才能出错。若要查看此理论是否正确,请仅使用一行数据(
[('one','value1'))尝试此方法
--您的行中应该有一个文本
。或者,如果问题是编码问题,您仍然应该在行中得到一个值,告诉您出了什么问题。此外,2019年以前的SQL Server不支持UTF-8,甚至只有字段使用特殊排序规则。SQL Server中的所有Unicode字符串ver是UTF-16。我对
pyodbc
几乎一无所知,但如果那些
setdecoding
/
setencoding
调用是必要的和/或正确的,我会感到惊讶。Microsoft提供的示例似乎不包括它们。@Jeroemostert hwat让我困扰不已的是,除了具有快速executema的Linux之外,任何情况下都能正常工作ny.Windows(在任何一种模式下)或Linux的fast ExecuteManay设置为False都可以很好地工作。我还尝试了
latin
而不是
utf-8
,结果都是一样的。您肯定需要去掉
conn.setdecoding
conn.setencoding
语句。SQL Server ODBC不使用utf-8编码。(它使用UTF 16LE,这是PyoDoc默认值)。此外,从终端提示运行<代码> OBCCIST-J/COD>检查UNIXODBC版本,并考虑如果旧的升级它。@ GordThompson谢谢。我用UNIXODBC设置更新了问题(在底部),我需要从这升级吗?