web-dev-qa-db-fra.com

Connexion à SQL Server 2012 à l'aide de sqlalchemy et pyodbc

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!

20
Brad Campbell

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 .

32
Bryan

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.

18
Andrew

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")
13
pooja karande

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"

1
ssword