【问题标题】:Unable to connect to MSSQL from Python无法从 Python 连接到 MSSQL
【发布时间】:2015-06-23 20:50:15
【问题描述】:

我的 Python 代码:

import pyodbc
cnxn = pyodbc.connect('DRIVER=FreeTDS;DSN=S29;UID=test;PWD=test;TDS_Version=8.0;ClientCharset=UTF8')
cursor = cnxn.cursor()
cursor.execute("select user_id, user_name from users")
rows = cursor.fetchall()
for row in rows:
  print row.user_id, row.user_name

得到错误:

Traceback (most recent call last):
File ".../test_mssql_connect.py", line 4, in <module>
cnxn = pyodbc.connect('DRIVER=FreeTDS;DSN=S29;UID=test;PWD=test;TDS_Version=8.0;ClientCharset=UTF8')
pyodbc.Error: ('HY000', '[]  (20013) (SQLDriverConnect)')

我找不到信息,这个错误是什么('HY000', '[] (20013) (SQLDriverConnect)')以及如何解决。

同时通过tsqlosqlisql成功连接到基地

我的odbc.ini

[S29]
Driver=FreeTDS
Description=S29
ServerName=192.168.0.29
Database=test
UID=test
PWD=test
TDS_Version=8.0

我的odbcinst.ini

[FreeTDS]
Description=FreeTDS
Driver=/usr/local/Cellar/freetds/0.95.1/lib/libtdsodbc.so
Setup=/usr/local/Cellar/freetds/0.95.1/lib/libtdsodbc.so
UsageCount=2
CPTimeout =
CPReuse =
TDS Version = 8.0
client charset = utf-8

我的 freetds.conf

[global]
tds version = 8.0
[192.168.0.29]
host = 192.168.0.29
port = 1433
tds version = 8.0
[S29]
host = 192.168.0.29
port = 1433
tds version = 8.0

【问题讨论】:

  • 你能从运行代码的机器远程登录到 SQL Server IP 地址吗?从终端(Windows 上的 cmd),尝试:telnet 192.168.0.29 1433 如果它连接,你很好。如果它只是在“正在连接...”处显示,则您无法访问远程 SQL Server。
  • 通过 telnet 连接成功,而且从控制台使用 tsql、osqlisql 进行的所有测试也正常,但连接不成功从 python 工作。在来自 python 的服务器 CentOS 连接上一切正常,但在我的工作 Mac 上没有任何工作。

标签: python sql-server macos pyodbc freetds


【解决方案1】:

您的 freetds.conf 设置是什么?请注意,您很可能希望使用 TDS 版本 7.3,尽管我认为这不是问题,尽管它可能是,因为它默认为 TDS 版本 7.1。 FreeTDS 支持的 TDS 版本号的文档:

http://www.freetds.org/userguide/choosingtdsprotocol.htm

您可能必须提供端口号,但如果没有看到您的 freetds.conf DSN 设置,则很难判断。如果没有来自 Python 的 DSN,我的运气会更好。由于 8.0 不是有效的 TDS 版本,我将为您提供一个适用于我的完整示例:

freetds.conf:

[examplesql]
        host = examplesql.server.com
        port = 1433
        tds version = 7.3

odbc.ini:

[examplesql]
Driver = FreeTDS
Server = examplesql.server.com
Port = 1433
TDS_Version = 7.3

odbcinst.ini:

[FreeTDS]
Description = FreeTDS with Protocol up to 7.3
Driver = /usr/lib64/libtdsodbc.so.0

pyodbc 连接,无 DSN:

DRIVER={FreeTDS};SERVER=examplesql.server.com;PORT=1433;DATABASE=dbname;UID=dbuser;PWD=dbpassword;TDS_Version=7.3;

您必须修改 odbcinst.ini 以指向您的驱动程序所在的位置。一些注意事项:

  • 您必须更新 TDS 版本以匹配您正在运行的 SQL Server 版本和您正在运行的免费 TDS 版本。 0.95 版支持 TDS 7.3 版。
  • TDS 7.3 版可与 MS SQL Server 2008 及更高版本一起使用。
  • 为 MS SQL Server 2005 使用 TDS 版本 7.2。

查看这里了解更多:

https://msdn.microsoft.com/en-us/library/dd339982.aspx

祝你好运。

【讨论】:

  • 切换版本 ini 文件中的免费 TDS 不会给出任何结果。问题并不完全在这个地方。因此,在我的测试中,我使用了 8.0 版本
  • 我遇到了一个奇怪的问题:您的用户名或密码是否超过 25 个字符? FreeTDS 将字段限制为 25 个字符,IIRC。你能把你得到的完整错误也包括在内,还是上面的整个 sn-p?
  • 密码与示例中的相同。错误显示完整,这里是控制台的screenshot
  • 那样的话,我就不知所措了。对不起!也许尝试使用 SERVER= 示例进行连接?
【解决方案2】:

我重新安装 pyodbc,现在可以使用了。 我在这里下载它https://github.com/juztin/pyodbc

 python setup.py build install --macports

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 2015-01-15
    相关资源
    最近更新 更多