【发布时间】:2016-04-14 18:26:48
【问题描述】:
我正在尝试使用 SQLALchemy 和 pyodbc 连接到 SQL Server Express 数据库,但我不断收到错误消息:
(pyodbc.Error) ('IM002', '[IM002] [unixODBC][Driver Manager]Data 未找到源名称,并且未指定默认驱动程序 (0) (SQLDriverConnect)')
我真的不明白我的引擎网址是错误的还是其他的。 我的情况如下:
- 我使用的是 Mac
- 我有一个 docker 容器(基于带有
unixodbc和unixodbc-dev的 Debian 映像),我的 python 应用程序试图在其中连接到... - 一个运行 windows 8 和 SQL express 2014 的 virtualbox 虚拟机...
我为 SQL express 配置了一个用户,使用 SQL Server 身份验证:
- 用户:ar_user
- 密码:ar_psw
...然后:
- 我将 TCP 端口配置为 1433 并禁用了动态端口(SQL Server 配置管理器 > 网络配置 > 协议)。
- 我关闭了 Windows 防火墙。
- 我为运行 windows8 的 VM 使用了仅主机适配器
现在...
可以从主机(我的 mac)访问 VM,因为:
ping -c 3 vm-ip
成功了!
但是虽然我尝试了所有可能的用户、密码、ip、服务器名称和端口的排列:
'mssql+pyodbc://ar_user:ar_psw@vm-ip/master'-
'mssql+pyodbc://ar_user:ar_psw@vm-ip:1433/master' 'mssql+pyodbc://IE10WIN8\\SQLEXPRESS''mssql+pyodbc://ar_user:ar_psw@IE10WIN8\\SQLEXPRESS''mssql+pyodbc://ar_user:ar_psw@IE10WIN8\\SQLEXPRESS:1433''mssql+pyodbc://ar_user:ar_psw@IE10WIN8\\SQLEXPRESS:1433/master'
...还有更多!
我总是收到“找不到数据源错误”。 我该怎么办?
ps:即使在 docker 容器中,vm 也可以 ping 通!
更新(已解决但不是 100%):
我是这样解决的:
我以这种方式使用/etc/odbcinst.ini配置了FreeTDS驱动:
[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
client charset = UTF-8
在/etc/freetds/freetds.conf:
[global]
tds version = 7.3
client charset = UTF-8
然后我使用以下字符串创建了引擎:
'mssql+pyodbc://my_user:my_psw@machine_ip:1433/my_db?driver=FreeTDS'
它似乎工作正常,但我收到以下警告:
SA 警告:无法识别的服务器版本信息“95.12.255”。版本 特定行为可能无法正常运行。如果使用 ODBC FreeTDS,确保 TDS_VERSION 7.0 到 7.3,而不是 4.2,配置在 FreeTDS 配置。
我还使用环境变量定义了 TDS 版本,但它并没有解决问题……知道吗?
【问题讨论】:
-
查看文档here。您要么需要提供 DSN 名称(如“odbc.ini”文件中定义的那样),要么需要在连接 URL 中明确提供
driver=名称。在您的情况下,DSN 连接可能是最安全的选择。 -
Gord 是正确的,DSN 是要走的路。此外,请确保您已将适当的端口 (1433) 从访客 VM 转发到主机 Mac。
-
查看我更新的笔记 ;)
-
@GordThompson 和 FlipperPA 是正确的。这似乎是解决这个问题的理想方式。或者,我建议您使用 pymssql:github.com/pymssql/pymssql。基本压力测试表明它比 pyodbc 性能略高
-
我尝试连接 "mssql+pyodbc:///?odbc_connect=" 和 params = parse.quote("Driver={{FreeTDS}};Server={};Port=1433 ;" "数据库={};UID={};PWD={};" .format(db_host, db_name, db_user, db_pass)) create_engine('mssql+pyodbc:///?odbc_connect={}'.format( params) 并且两次我都得到了 base.py:1586: SAWarning: Unrecognized server version info '95.12.255'。如果将 ODBC 与 FreeTDS 一起使用,请确保在 FreeTDS 配置中配置了 TDS_VERSION 7.0 到 7.3,而不是 4.2。“。” .join(str(x) for x in self.server_version_info))
标签: sql-server sqlalchemy odbc pyodbc unixodbc