2012-03-15 19 views
22

Estoy tratando de conectarme a una base de datos MSSQL de python en Linux (SLES).¿Qué está causando 'no se puede conectar a la fuente de datos' para pyodbc?

He instalado pyodbc y Free TDS. Desde la línea de comandos:

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

se conecta al servidor sin ningún problema, sin embargo, desde Python:

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

produce un error:

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

estoy encontrando este error inútilmente vago. Incluso una sugerencia para reducir el problema sería útil en este momento.

Editar: Mirando el TDS registro de volcado parece que este es el lugar donde todo se desmorona:

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" 

Respuesta

10

Después de horas de ir en círculos resulta que lo único que faltaba era

TDS_Version = 8,0 en el DSN en mi archivo odbc.ini.

Lo había especificado en otro lugar, pero también tenía que estar aquí, aparentemente.

Espero que esto ayude a otra pobre alma.

+0

Esto es de hecho correcto. Muchas gracias – chhantyal

4

Sólo por un punto de datos adicional, odbc.ini está vacío en mi anfitrión, y ODBCINST. ini tiene las siguientes líneas:

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

último, el archivo freetds.conf tiene estas líneas:

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

Si bien es cierto que se pueden especificar opciones de configuración en odbc.ini, hacerlo de esta manera permite que las opciones de configuración se administren todas donde lo espere, el archivo freetds.conf.

+1

Interesante. Tuve la versión de tds establecida en 8.0 en mis freetds.conf, tanto en DSN global como en cada DSN individual. Por alguna razón, solo funcionó después de que se agregó en la otra ubicación también. – pbaehr

+0

Wow, acabo de pasar por el mismo problema. No funcionó en Python hasta que agregué manualmente tds version = 8.0 al archivo freetds.conf. Aunque los comentarios en ese archivo dicen que es irrelevante y está comentado por defecto:! –

2

También estaba teniendo problemas con esto después de actualizar mi versión de Ubuntu a 12.04. Mi configuración de freetds anterior /etc/freetds/freetds.conf no se encontró, así que tuve que moverlo a /usr/local/etc en cuyo punto comenzó a funcionar de nuevo.

También mi ubicación del controlador es /usr/local/lib/libtdsodbc.so

Espero que esto ayude a salvar a alguien un día y medio!

17

Trato con:

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

Y esto funciona para mí:

Conexión de prueba:

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

el complemento /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 

en /etc/odbc.ini agregar:

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

en /etc/freetds/freetds.conf añadir:

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

prueba con 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

Uno de los comandos más útiles para conocer los detalles del servidor es ** tsql -LH hostname **. – FUD

+0

Muy útil respuesta. ¡Muchas gracias! :) – user1158559

8

que tenían el mismo problema y me di cuenta que le faltaba el parámetro en TDS_Version la llamada al connect(). El siguiente código funciona para mí para conectar a una instancia de Microsoft 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

Adición TDS_Version a la cadena de conexión trabajó para mí:

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

-1

el seguimiento funcionó para mí:

Modificar 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

Mi problema era que en mi archivo de configuración estaba configurando HOST para el IP del servidor SQL, sin embargo, después de horas de quitarme el pelo me di cuenta de que el HOST debe configurarse en el Nombre del origen de datos []

0

También puede establecer una variable de entorno en su secuencia de comandos python:

os.environ['TDSVER'] = '8.0' 
Cuestiones relacionadas