2016-11-16 80 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

相關問題