2012-03-15 75 views
22

Tôi đang cố kết nối với cơ sở dữ liệu MSSQL từ python trên Linux (SLES).Điều gì gây ra 'không thể kết nối với nguồn dữ liệu' cho pyodbc?

Tôi đã cài đặt pyodbc và TDS miễn phí. Từ dòng lệnh:

tsql -H server -p 1433 -U username -P password 

Kết nối đến máy chủ mà không có một vấn đề, tuy nhiên, từ Python:

import pyodbc 
pyodbc.connect(driver='{FreeTDS}', server='server', database='database', uid='username', pwd='password') 

sản lượng một lỗi:

pyodbc.Error: ('08001', '[08001] [unixODBC][FreeTDS][SQL Server]Unable to connect to data source (0) (SQLDriverConnect)') 

Tôi đang tìm kiếm lỗi này unhelpfully mơ hồ. Ngay cả một đề xuất để thu hẹp vấn đề sẽ hữu ích ngay bây giờ.

Edit: Nhìn vào TDS log đổ có vẻ như đây là nơi mà toàn bộ điều sụp đổ:

token.c:328:tds_process_login_tokens() 
util.c:331:tdserror(0x87bbeb8, 0x8861820, 20017, 115) 
odbc.c:2270:msgno 20017 20003 
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2) 
util.c:384:tdserror: returning TDS_INT_CANCEL(2) 
util.c:156:Changed query state from IDLE to DEAD 
token.c:337:looking for login token, got 0() 
token.c:122:tds_process_default_tokens() marker is 0() 
token.c:125:leaving tds_process_default_tokens() connection dead 
login.c:466:login packet accepted 
util.c:331:tdserror(0x87bbeb8, 0x8861820, 20002, 0) 
odbc.c:2270:msgno 20002 20003 
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2) 
util.c:384:tdserror: returning TDS_INT_CANCEL(2) 
mem.c:615:tds_free_all_results() 
error.c:412:odbc_errs_add: "Unable to connect to data source" 

Trả lời

10

Sau giờ đi trong vòng tròn nó quay ra tất cả những gì đã mất tích là

TDS_Version = 8,0 trong DSN trong tập tin ODBC.INI tôi.

Tôi đã chỉ định nó ở nơi khác, nhưng nó cũng cần phải ở đây.

Hy vọng điều này sẽ giúp một số linh hồn nghèo khác.

+0

Điều này thực sự là chính xác. Rất cám ơn – chhantyal

4

Chỉ cần cho một datapoint thêm, ODBC.INI trống trên máy chủ của tôi, và odbcinst. ini có những dòng sau:

# Driver from FreeTDS 
# 
[FreeTDS] 
Driver = /usr/lib64/libtdsodbc.so.0 

cuối cùng, các tập tin freetds.conf có những dòng này:

[global] 
    host= <hostname> 
    port= <mssql port> 
    tds version = 8.0 

Trong khi người ta có thể xác định các thiết lập tùy chọn trong odbc.ini, thực hiện theo cách này cho phép các tùy chọn cấu hình được quản lý ở nơi bạn muốn - tập tin freetds.conf.

+1

Thú vị. Tôi đã có phiên bản tds thiết lập để 8,0 trong freetds.conf của tôi, cả dưới toàn cầu và mỗi DSN cá nhân. Vì lý do nào đó, nó chỉ hoạt động sau khi nó được thêm vào ở vị trí khác. – pbaehr

+0

Ồ, tôi vừa trải qua cùng một vấn đề. Nó không hoạt động trong Python cho đến khi tôi thêm tds version = 8.0 vào tập tin freetds.conf. Mặc dù các nhận xét trong tệp đó nói rằng nó không có liên quan và được nhận xét theo mặc định:! –

2

Tôi cũng gặp sự cố với vấn đề này sau khi nâng cấp phiên bản ubuntu lên 12.04. Cấu hình freetds cũ của tôi /etc/freetds/freetds.conf không được tìm thấy vì vậy tôi phải di chuyển nó đến /usr/local/etc tại thời điểm đó nó bắt đầu hoạt động trở lại.

Ngoài ra vị trí lái xe của tôi là /usr/local/lib/libtdsodbc.so

Hy vọng điều này sẽ giúp tiết kiệm cho ai đó một ngày rưỡi!

17

tôi thử với:

  • MS SQL 2008 Datacenter
  • Ubuntu 12.04 TLS (amd64)
  • Python 2.7

Và việc này đối với tôi:

Test connection:

tsql -H 10.19.4.42 -p 1433 -U DAVIDG -P 123456 

trên add /etc/odbcinst.ini:

[ODBC] 
Trace = Yes 
TraceFile = /tmp/odbc.log 

[FreeTDS] 
Description = TDS driver (Sybase/MS SQL) 
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so 
Setup = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so 
UsageCount = 1 

trên /etc/odbc.ini thêm:

[SQLDemo] 
Description=my dsn 
Driver=FreeTDS 
Database=teste3 
Servername=SQLDemo 

trên /etc/freetds/freetds.conf thêm:

[SQLDemo] 
     host = 10.19.4.42 
     port = 1433 
     tds version = 8.0 

thử nghiệm với test.py:

#!/usr/bin/python 

import pyodbc 
cnx = pyodbc.connect("DSN=SQLDemo;UID=DAVIDG;PWD=123456") 

cursor = cnx.cursor() 
cursor.execute("select * from Company;") 
for row in cursor: 
    print row.Name 
+4

Một trong những lệnh rất hữu ích để biết chi tiết máy chủ là ** tsql -LH hostname **. – FUD

+0

Câu trả lời rất hữu ích. Cảm ơn bạn rất nhiều! :) – user1158559

8

tôi đã cùng một vấn đề và tôi phát hiện ra rằng nó đã thiếu thông số TDS_Version trong cuộc gọi đến connect(). Các mã sau đây làm việc cho tôi để kết nối với một thể hiện của MS SQL Server 2008:

import pyodbc 

driver = '/opt/local/lib/libtdsodbc.so' # Change this to where FreeTDS installed the driver libaray! 

conn = pyodbc.connect(
    driver = driver, 
    TDS_Version = '7.2', # Use for 
    server = '<hostname or ip address>', 
    port = 1433, 
    database = '<database>', 
    uid = '<uid>', 
    pwd = '<pwd>') 
3

Thêm TDS_Version đến chuỗi kết nối làm việc cho tôi:

connection_string = 'DRIVER={{FreeTDS}};SERVER={server};PORT=1433;DATABASE={database};UID={uid};PWD={pwd};TDS_VERSION=8.0'

-1

Các theo từng làm việc cho tôi:

Sửa python2.7/site-packages/sql_server/pyodbc/base.py

def get_new_connection(self, conn_params): 
... 
- cstr_parts['SERVERNAME'] = host 
+ cstr_parts['SERVER'] = host 
+ cstr_parts['PORT'] = str(port) 
1

Vấn đề của tôi là trên tệp cài đặt của tôi, tôi đã đặt HOST thành IP của Máy chủ SQL, tuy nhiên sau vài giờ kéo tóc tôi, tôi đã tìm ra rằng HOST phải được đặt thành Tên Nguồn Dữ liệu []

0

Bạn cũng có thể đặt biến môi trường trong tập lệnh python của bạn:

os.environ['TDSVER'] = '8.0' 
Các vấn đề liên quan