J'essaie de me connecter à une base de données SQL Server 2012 à l'aide de SQLAlchemy (avec pyodbc) sur Python 3.3 (Windows 7-64 bits). Je suis en mesure de me connecter à l'aide de pyodbc simple mais j'ai été échec de connexion à l'aide de SQLAlchemy. J'ai la configuration du fichier DSN pour l'accès à la base de données.
Je me connecte avec succès en utilisant pyodbc droit comme ceci:
con = pyodbc.connect('FILEDSN=c:\\users\\me\\mydbserver.dsn')
Pour sqlalchemy, j'ai essayé:
import sqlalchemy as sa
engine = sa.create_engine('mssql+pyodbc://c/users/me/mydbserver.dsn/mydbname')
La méthode create_engine
Ne configure pas réellement la connexion et réussit, mais si j'essaie quelque chose qui fait que sqlalchemy configure réellement la connexion (comme engine.table_names()
), cela prend un certain temps, puis retourne cette erreur:
DBAPIError: (Error) ('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect)') None None
Je ne sais pas où les choses vont mal: comment voir quelle chaîne de connexion est réellement passée à pyodbc par sqlalchemy. J'ai réussi à utiliser les mêmes classes sqlalchemy avec SQLite et MySQL.
Merci d'avance!
La chaîne DSN basée sur un fichier est interprétée par SQLAlchemy comme nom de serveur = c
, nom de base de données = users
.
Je préfère me connecter sans utiliser de DSN, c'est une tâche de configuration en moins à gérer lors des migrations de code.
Cette syntaxe fonctionne à l'aide de l'authentification Windows:
engine = sa.create_engine('mssql+pyodbc://server/database')
Ou avec l'authentification SQL:
engine = sa.create_engine('mssql+pyodbc://user:password@server/database')
SQLAlchemy a une explication approfondie des différentes options de chaîne de connexion ici .
J'ai des informations de mise à jour sur la connexion au serveur MSSQL sans utiliser de DSN et en utilisant l'authentification Windows. Dans mon exemple, j'ai les options suivantes: Mon nom de serveur local est "(localdb)\ProjectsV12". Nom du serveur local que je vois dans les propriétés de la base de données (j'utilise Windows 10/Visual Studio 2015). Mon nom de base de données est "MainTest1"
engine = create_engine('mssql+pyodbc://(localdb)\ProjectsV12/MainTest1?driver=SQL+Server+Native+Client+11.0', echo=True)
Il est nécessaire de spécifier le pilote en connexion. Vous pouvez trouver votre version client dans:
panneau de configuration> Systèmes et sécurité> Outils d'administration.> Sources de données ODBC> onglet DSN système> Ajouter
Recherchez la version du client SQL Native dans la liste.
Dans Python 3 vous pouvez utiliser la fonction quote_plus
du module urllib.parse
pour créer des paramètres de connexion:
import urllib
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
"SERVER=dagger;"
"DATABASE=test;"
"UID=user;"
"PWD=password")
engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))
Pour utiliser l'authentification Windows, vous souhaitez utiliser Trusted_Connection comme paramètre:
params = urllib.parse.quote_plus("DRIVER={SQL Server Native Client 11.0};"
"SERVER=dagger;"
"DATABASE=test;"
"Trusted_Connection=yes")
Dans Python 2, vous devez utiliser la fonction quote_plus
de la bibliothèque urllib
à la place:
params = urllib.quote_plus("DRIVER={SQL Server Native Client 11.0};"
"SERVER=dagger;"
"DATABASE=test;"
"UID=user;"
"PWD=password")
Je veux juste ajouter quelques informations récentes ici: Si vous vous connectez en utilisant des connexions DSN:
engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@SOME_DSN")
Si vous vous connectez à l'aide de connexions de nom d'hôte:
engine = create_engine("mssql+pyodbc://USERNAME:PASSWORD@Host_IP:PORT/DATABASENAME?driver=SQL+Server+Native+Client+11.0")
Pour plus de détails, veuillez vous référer au "Document officiel"