2016-11-16 74 views
1

我遇到了一个非常奇怪的问题:我能够使用tsql连接到我的SQL Server,但我无法对pymssql做同样的事情。让我给你更多的细节。tsql实用程序(FreeTDS)可以连接到SQL Server,但pymssql不能

有了这种tsql命令的一切似乎是确定:

$ tsql -H '10.10.10.2' -U 'DOMAIN\myuser' -p 63849 
Password: 
locale is "fr_FR.UTF-8" 
locale charset is "UTF-8" 
using default charset "UTF-8" 
1> 

但以下基本Python脚本我有一个问题:

$ cat test_mssql.py 
# -*- coding: utf8 -*- 
import pymssql 
import pandas as pd 

conn = pymssql.connect(server=r'10.10.10.2', user=r'DOMAIN\myuser', password='mypassword', port='63849') 

$ python test_mssql.py 
Traceback (most recent call last): 
File "api-vinci-rh/current/test_mssql.py", line 60, in <module> 
conn = pymssql.connect(server=r'10.10.10.2', user=r'DOMAIN\myuser', password='mypassword', port='63849') 
File "pymssql.pyx", line 641, in pymssql.connect (pymssql.c:10788) 
pymssql.OperationalError: (20002, 'DB-Lib error message 20002, severity 9:\nAdaptive Server connection failed\n') 

通过激活TDSDUMPCONFIG环境变量,我可以请参阅tls命令和我的python脚本之间的区别:

TDSDUMPCONFIG tls trace 
config.c:224:Final connection parameters: 
config.c:225:   server_name = 10.10.10.2 
config.c:226:  server_host_name = 10.10.10.2 
config.c:227:    ip_addr = 10.10.10.2 
config.c:228:   instance_name = 
config.c:229:     port = 63849 
config.c:230:   major_version = 7 
config.c:231:   minor_version = 1 
config.c:232:    block_size = 0 
config.c:233:    language = us_english 
config.c:234:   server_charset = 
config.c:235:  connect_timeout = 0 
config.c:236:  client_host_name = myhost 
config.c:237:   client_charset = UTF-8 
config.c:238:    app_name = TSQL 
config.c:239:    user_name = DOMAIN\myuser 
config.c:242:    library = TDS-Library 
config.c:243:    bulk_copy = 0 
config.c:244:  suppress_language = 0 
config.c:245:   encrypt level = 0 
config.c:246:   query_timeout = 0 
config.c:249:    database = 
config.c:250:    dump_file = /tmp/freetds.log 
config.c:251:   debug_flags = 0 


TDSDUMPCONFIG pymssql trace 
config.c:224:Final connection parameters: 
config.c:225:   server_name = 10.10.10.2:63849 
config.c:226:  server_host_name = 10.10.10.2 
config.c:227:    ip_addr = 10.10.10.2 
config.c:228:   instance_name = 
config.c:229:     port = 63849 
config.c:230:   major_version = 7 
config.c:231:   minor_version = 1 
config.c:232:    block_size = 0 
config.c:233:    language = us_english 
config.c:234:   server_charset = 
config.c:235:  connect_timeout = 0 
config.c:236:  client_host_name = myhost 
config.c:237:   client_charset = UTF-8 
config.c:238:    app_name = pymssql=2.1.2 
config.c:239:    user_name = 
config.c:242:    library = DB-Library 
config.c:243:    bulk_copy = 0 
config.c:244:  suppress_language = 0 
config.c:245:   encrypt level = 0 
config.c:246:   query_timeout = 0 
config.c:249:    database = 
config.c:250:    dump_file = /tmp/freetds.log 
config.c:251:   debug_flags = 0 
config.c:252:    text_size = 64512 
config.c:253:   broken_dates = 0 
config.c:254:  emul_little_endian = 0 
config.c:255:  server_realm_name = 

我认为两个主要区别是关于user_name,它是python脚本和libraryDB-Library而不是TDS-Library是空的。

我目前发现没有办法强制这些参数在python脚本中,我发现没有关于我的问题(错误消息是通用的)的线索。

我使用python 2.7.9和我的ENV pymssql==2.1.2 更多信息:

$ tsql -C 
Compile-time settings (established with the "configure" script) 
          Version: freetds v0.91 
      freetds.conf directory: /etc/freetds 
    MS db-lib source compatibility: no 
     Sybase binary compatibility: yes 
         Thread safety: yes 
          iconv library: yes 
         TDS version: 4.2 
           iODBC: no 
          unixodbc: yes 
       SSPI "trusted" logins: no 
          Kerberos: yes 

$ grep -v '^#' /etc/freetds/freetds.conf 
[global] 
    tds version = 7.1 
    dump file = /tmp/freetds.log 
    text size = 64512 
    enable gssapi delegation = off 

如果您有任何线索,以帮助让我知道。

编辑:我还有一个SQL Server实例为我的测试,我的Python脚本工作......在TDSDUMPCONFIG的username设置。所以Iguess在我的环境上有一些奇怪的东西,但不知道什么

+0

'的Adaptive Server connection'的lenght任何lenght限制或问题?这听起来像Sybase。您确定您没有错误地使用Sybase提供程序吗?微软在20年前购买了Adaptive Server的代码。两家公司都使用TDS和T-SQL这样的名称。 –

+0

在任何情况下,您都没有发布任何* T-SQL代码。你发布的是不同命令行工具的命令行参数。 'tsql'是一个FreeTDS工具。除非你的Python代码*也*使用FreeTDS,你不能使用'tsql'的结果来表明你的代码是OK –

+0

@PanagiotisKanavos你没错:我没有发布和T-SQL代码,但我可以用'tsql'客户端我可以请求数据 – Labynocle

回答

1

我发现一个线索,我很惊讶byt it ...如果我用一个username少于32个字符,我没有更多的问题与pymssql!我没有发现任何关于这个奇怪的错误(?),但我promess它修复了我的问题。

我需要看到的pymssql代码,看看我找到了username

+1

感谢您报告您的发现。你遇到的限制在这里讨论(https://github.com/pymssql/pymssql/issues/246)。好消息是,现在和未来的pymssql版本现在不应该受到影响,因为FreeTDS版本晚于v0.91已经通过db-lib API修补了更长的用户名和密码,这是pymssql使用的API。 –

+0

谢谢你对这些细节@GordThompson :)我错过了! – Labynocle

相关问题