我正在尝试使用SQL server 2000
和Windows server 2003
模块从Windows Server 2008 R2
连接到Python 3.4
上安装的pyodbc
。这些服务器位于不同的AD域中。在SQL Server上启用了Windows only
身份验证,我无法更改。
drv = '{SQL server}'
svr = 'sql.my-domain.local'
usr = 'my-domain.local\testuser'
pwd = 'password'
db = 'testdb'
pyodbc.connect(driver=drv, server=svr, user=usr, password=pwd, database=db)
上述连接失败,出现以下错误:
pyodbc.Error: ('28000', "[28000] [Microsoft][ODBC SQL Server Driver][SQLServer]
Login failed for user 'svx-iroot.local\\sqlexecutive'.
Reason: Not associated with a trusted SQL Server connection. (18452) (SQLDriverConnect)")
有一些问题,例如this one,建议将trusted_connection='yes'
参数添加到pyodbc
连接以支持Windows身份验证,但在这种情况下它没有帮助,因为使用此选项本地使用凭据,我需要明确提供凭据,因为发起工作站位于不同的AD域中。
使用User DSN
驱动程序在ODBC Data Source Administrator
中创建SQL Server
失败,并出现上述错误。
有没有办法让这项工作?
同时我从http://sourceforge.net/projects/freetdswindows/为Windows安装了FreeTDS
驱动程序,使用tsql
实用程序进行连接测试确实有效:
tsql -S sql.my-domain.local -U my-domain.local\testuser -P password
但FreeTDS
中没有ODBC Data Source Administrator
驱动程序。 FreeTDS
驱动程序传统上与unixODBC
一起使用。是否可以在Windows环境中使用此驱动程序pyodbc
?
更新
上面提到的FreeTDS
二进制文件也包括unixODBC
。 freetds.conf
,odbc.ini
和odbcinst.ini
的配置与所描述的相同,例如,here。但是在这一点上,我并不了解pyodbc
应该知道FreeTDS
驱动程序是否存在。事实上,与FreeTDS
驱动程序的连接尝试失败,并出现以下错误:
pyodbc.Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager]
Data source name not found and no default driver specified (0) (SQLDriverConnect)')
Pyodbc
只知道ODBC Data Source Administrator
中可用的驱动程序:
有两种方法可以向前推进。第一个选项是让ODBC Data Source Administrator
知道FreeTDS
驱动程序。为此,需要在名为HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers
且值为FreeTDS
的注册表项Installed
中创建新值。然后在FreeTDS
中创建一个新密钥HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI
,并将FreeTDS
驱动程序的设置设置为此注册表项中的字符串值。
完成此过程FreeTDS
驱动程序在ODBC Data Source Administrator
中可用,但连接仍然失败。尝试使用User DSN
在ODBC Data Source Administrator
中创建FreeTDS
失败,错误代码193
由64位ODBC Data Source Administrator
和32位版本{{1}的不兼容性引起}。我没有64位版本的FreeTDS
可用。可能有可能从源代码编译它。
另一个选择是让FreeTDS
使用其他驱动程序管理器(pyodbc
)而不是unixODBC
。不知道如何接近它。
答案 0 :(得分:3)
我最终使用pymssql版本2.1.3安装了从http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql获得的轮子。它已包含FreeTDS
,并且开箱即用:
import pymssql
conn = pymssql.connect(
host=r'sql.my-domain.local',
user=r'my-domain.local\testuser',
password='password',
database='testdb'
)
cursor = conn.cursor()
cursor.execute('SELECT * FROM testtable')