为啥我可以使用 tsql 而不是 pymssql 连接到 Azure MS SQL?

Posted

技术标签:

【中文标题】为啥我可以使用 tsql 而不是 pymssql 连接到 Azure MS SQL?【英文标题】:Why can I connect to Azure MS SQL with tsql but not pymssql?为什么我可以使用 tsql 而不是 pymssql 连接到 Azure MS SQL? 【发布时间】:2016-08-24 17:49:33 【问题描述】:

我今天在哪里:

TDSVER=7.3 tsql -H example.database.windows.net -U me -D ExampleDB -p 1433 -P notreallymypassword

这不是:

>>> import pymssql
>>> pymssql.connect('example.database.windows.net', user='me', password='notreallymypassword', database='ExampleDB', tds_version='7.3')

它失败了

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pymssql.pyx", line 635, in pymssql.connect (pymssql.c:10734)
  File "_mssql.pyx", line 1902, in _mssql.connect (_mssql.c:21821)
  File "_mssql.pyx", line 577, in _mssql.MSSQLConnection.__init__ (_mssql.c:6214)
  File "_mssql.pyx", line 1704, in _mssql._tds_ver_str_to_constant (_mssql.c:18845)
_mssql.MSSQLException: unrecognized tds version: 7.3

好的。嗯,这……很奇怪。所以我回去用TDSVER=7.2尝试了tsql,它似乎工作正常。

尝试与tds_version='7.2' 联系给了我:

Traceback (most recent call last):
  File "pymssql.pyx", line 635, in pymssql.connect (pymssql.c:10734)
  File "_mssql.pyx", line 1902, in _mssql.connect (_mssql.c:21821)
  File "_mssql.pyx", line 637, in _mssql.MSSQLConnection.__init__ (_mssql.c:6581)
  File "_mssql.pyx", line 1630, in _mssql.maybe_raise_MSSQLDatabaseException (_mssql.c:17524)
_mssql.MSSQLDatabaseException: (20002, b'DB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (datawhse.database.
windows.net:1433)\n')

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pymssql.pyx", line 641, in pymssql.connect (pymssql.c:10824)
pymssql.OperationalError: (20002, b'DB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (datawhse.database.windo
ws.net:1433)\n')

那么,什么给了?

更新 1: pyodbc 连接失败:

conn = pyodbc.connect('SERVER=example.database.windows.net;Driver=FreeTDS;UID=me@example.database.windows.net;PWD=notmyrealpassword;'
, ansi=True)

我的~/.odbcinst.ini:

[FreeTDS]
Description     = MS SQL driver
Driver          = /usr/lib64/libtdsodbc.so.0
Driver64        = /usr/lib64/libtdsodbc.so.0
Setup           = /usr/lib64/libtdsS.so.0
Setup64         = /usr/lib64/libtdsS.so.0
UsageCount      = 1
CPTimeout       =
CPReuse         =
Trace           = Yes

这个输出:

⚘ odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/me/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

【问题讨论】:

你运行的是什么版本的pymssqlfreetds 另外,请参阅 Gord 关于 SSL/TLS 的回答:***.com/questions/39040536/… @FlipperPA 我不在 windows (CentOS) 上,所以我不确定是否适用 This MSDN article 似乎也没有提到 SSL/TLS ( cc: @FlipperPA ) - “这篇 MSDN 文章似乎也没有提到 SSL/TLS” - 这篇文章专门指的是 Ubuntu,它附带了 openssl 和显然已配置为使 pip 在构建 pymssql 时可以找到它。对于 CentOS 来说,似乎并非总是如此,例如here. pip 不构建 pymssql - 它使用预先构建的***。 安装它时至少它下载了***。 【参考方案1】:

看起来 Gord 是对的:问题在于 pymssqlwheel没有 SSL 绑定

我卸载了它:

python -m pip uninstall pymssql

然后从源安装它:

python -m pip install --no-binary pymssql pymssql

这需要我安装一些依赖项。但现在我可以联系了

pymssql.connect('example.database.windows.net',
                user='me', 
                password='notreallymypassword', 
                database='ExampleDB',
                tds_version='7.2')

【讨论】:

【参考方案2】:

您的连接字符串看起来不正确。它应该是这样的:

pymssql.connect(server='example.database.windows.net', user='me@example', password='notreallymypassword', database='ExampleDB')

请注意,在您对connect() 的调用示例中,您缺少server= 参数;您只有完整的服务器名称。

【讨论】:

我的用户名 is 只是 me - 这就是 tsql 所拥有和工作的。使用 strace 我可以验证我实际上是在连接到 Azure 服务器并接收数据……尽管它可能只是错误消息。无论如何,我将其更改为me@example,并添加了server=(其中doesn't appear to be necessary),但它仍然不起作用) server 是第一个参数,所以 pymssql.connect('example.database.windows.net'...)pymssql.connect(server='example.database.windows.net'...) 是一样的

以上是关于为啥我可以使用 tsql 而不是 pymssql 连接到 Azure MS SQL?的主要内容,如果未能解决你的问题,请参考以下文章

tsql 登录失败,但管理工作室可以连接

来自 sqlserver 的 pymssql/freetds 日期

TSQL - 是不是可以定义排序顺序?

如何使用 TSQL 而不是 linq 获取和跳过记录 [重复]

我使用 pyinstaller 来打包我的 python 文件。为啥'import pymssql'总是出错

如何在 Ubuntu Linux 上将 pymssql 安装到 Python 3.4 而不是 2.7?