【发布时间】:2016-08-23 17:36:41
【问题描述】:
我正在尝试将从网络上抓取的数据插入到 SQL server db 中,并且我的 db 表的相关列设置为nvarchar(max) 类型。
在 python shell 中测试:
dbargs={'DATABASE': '<mydbname>',
'DRIVER': '{FreeTDS}',
'PORT': '1433',
'PWD': '<mypass>',
'SERVER': '<server>',
'UID': '<myusername>'}
import pyodbc
cnxn = pyodbc.connect(**dbargs)
cursor = cnxn.cursor()
insert_cmd="INSERT INTO c_master (run_id, product_name) VALUES (?,?)"
然后
cursor.execute(insert_cmd, (274, u'test naméâôóòöë'))
工作正常,但是
cursor.execute(insert_cmd, (274, u'test \u2019d'))
导致错误
ProgrammingError: ('42000', "[42000] [FreeTDS][SQL Server]Incorrect syntax near ','. (102) (SQLExecDirectW)")
我发现当我尝试将其插入到写入器管道中的数据库中时,我正在抓取后一种类型的数据并产生错误。
处理此类数据的正确方法是什么?
(我使用的是 FreeTDS、unixodbc、MSSQL Server、pyodbc)
FreeTDS 和 unixodbc 配置:
/etc/odbc.init:
[myserver]
Driver = FreeTDS
Description =Myserver MSSQL database
# Servername corresponds to the section in freetds.conf
Servername=myserver
Database = mydbname
TDS_Version = 7.0
/etc/odbcinst.ini:
[ODBC]
Trace = Yes
TraceFile = /tmp/odbcsql.log
ForceTrace = Yes
Pooling = Yes
[FreeTDS]
Description = TDS driver (Sybase/MS SQL)
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
CPTimeout = 120
CPReuse =
/etc/freetds/freetds.conf:
[global]
tds version = 7.0
dump file = /var/log/freetds.log
debug flags = 0xffff
# timeout = 10
# connect timeout = 10
text size = 64512
[myserver]
host = <myserverip>
port = 1433
tds version = 7.0
dump_file = /var/log/freetds.log
client charset = UTF-8
我还将 TDSDUMP="/var/log/freetds.log" 添加到 /etc/environment 和 /etc/profile。虽然很奇怪,但我仍然没有看到 freetds 日志。
【问题讨论】:
-
你好,有几个问题。您使用的是 Python 2 还是 Python 3?要正确使用 Unicode,您还必须将
TDS_Version传递给连接字符串 - 您是否在 DSN 定义中这样做? -
Python 2.7。我设置了 TDS_Versionin /etc/odbc.ini。我现在将更新我的问题以包含这些配置文件。
-
查看 /tmp/freetds.log 似乎显示版本 4.2 尽管我的配置。我想这可能是问题所在!任何想法为什么我的 conf 没有给我 7.0 版?
-
@FlipperPA 我还发现,如果我按照您所说的将“TDS_Version”传递给连接字符串,它就可以工作!很明显,我的 freetds conf 只是被忽略或损坏了?
-
我已经提交了一些关于 TDS 版本的更多信息作为答案。
标签: sql-server unicode pyodbc freetds