web-dev-qa-db-fra.com

Qu'est-ce qui cause "l'impossibilité de se connecter à la source de données" pour pyodbc?

J'essaie de me connecter à une base de données MSSQL à partir de python sous Linux (SLES).

J'ai installé pyodbc et Free TDS. A partir de la ligne de commande:

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

Se connecte au serveur sans problème, cependant, à partir de Python:

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

Donne une erreur:

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

Je trouve cette erreur inutilement vague. Même une suggestion visant à réduire le problème serait utile en ce moment.

Modifier: En regardant le vidage du journal TDS, on dirait que c'est là que tout s'écroule:

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"
23
pbaehr

Après des heures à tourner en rond, il s’est avéré que tout ce qui me manquait était

TDS_Version = 8.0in DSN dans mon fichier odbc.ini.

Je l'avais spécifié ailleurs, mais il devait être ici aussi, apparemment.

J'espère que cela aide une autre âme pauvre.

10
pbaehr

J'essaye avec:

  • Centre de données MS SQL 2008
  • Ubuntu 12.04 TLS (AMD64)
  • Python 2.7 

Et cela fonctionne pour moi:

Connexion de test:

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

sur /etc/odbcinst.ini, ajoutez:

[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

sur /etc/odbc.ini ajoutez:

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

sur /etc/freetds/freetds.conf, ajoutez:

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

test avec 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
17
José Ibañez

J'ai eu le même problème et j'ai découvert qu'il manquait le paramètre TDS_Version dans l'appel à connect(). Le code suivant me permet de me connecter à une instance de 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>')
9
Feuermurmel

Juste pour un point de donnée supplémentaire, odbc.ini est vide sur mon hôte et odbcinst.ini contient les lignes suivantes:

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

enfin, le fichier freetds.conf a ces lignes:

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

Bien que vous puissiez certainement spécifier les paramètres d’option dans odbc.ini, cette procédure permet de gérer toutes les options de configuration où vous vous attendez - le fichier freetds.conf.

4
Keith Schoenefeld

Ajouter TDS_Version à la chaîne de connexion a fonctionné pour moi:

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

3
cadizm

J'avais également des problèmes avec cela après la mise à niveau de ma version d'ubuntu vers 12.04. Mon ancien freetds config /etc/freetds/freetds.conf n’a pas été trouvé, donc j’ai dû le déplacer vers /usr/local/etc.

De plus, mon emplacement de pilote est /usr/local/lib/libtdsodbc.so

J'espère que cela aide à sauver quelqu'un d'un jour et demi!

2
Ben Ford

Mon problème était que, dans mon fichier de paramètres, je configurais l'hôte sur l'adresse IP de SQL Server. Cependant, après des heures passées à me déshabiller, j'ai compris que l'hôte devait être défini sur le nom de la source de données [].

2
Andres

Cela a fonctionné pour moi, pas sûr mais je pensais que cela pourrait aider quelqu'un

lancez la commande ci-dessous pour trouver quelle version d'odbcinst et d'isql vous utilisez

 which odbcinst

 which isql

Ensuite, lancez $ odbcinst -j pour trouver quels odbc.ini et odbcinst.ini sont utilisés.

Dans odbcinst.ini ajouter

[FreeTDS]
Description=FreeTDS Driver for Linux & MSSQL
Driver=/usr/local/lib/libtdsodbc.so
Setup=/usr/local/lib/libtdsodbc.so
UsageCount=1

Et dans odbc.ini configurez votre serveur comme

[YOUR_SERVER]
Driver = FreeTDS
Servername = <YOUR_MACHINE_NAME>
Database = <Database_You_Want_To_Connect>

J'ai trouvé une bonne description sur https://docs.snowflake.net/manuals/user-guide/odbc-linux.html#unixodbc

Regardez aussi https://github.com/lionheart/Django-pyodbc/wiki/Mac-setup-to-connect-to-a-MS-SQL-Server

0
user8615558

Vous pouvez également définir une variable d'environnement dans votre script python:

os.environ['TDSVER'] = '8.0'
0
Pathead