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"
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.
J'essaye avec:
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
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>')
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.
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'
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!
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 [].
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
Vous pouvez également définir une variable d'environnement dans votre script python:
os.environ['TDSVER'] = '8.0'