web-dev-qa-db-fra.com

Connexion à Microsoft SQL Server avec Python

J'essaie de me connecter à SQL via python pour exécuter des requêtes sur certaines bases de données SQL sur le serveur Microsoft SQL. D'après mes recherches en ligne et sur ce forum, la bibliothèque la plus prometteuse semble être pyodbc. J'ai donc fait le code suivant

import pyodbc
conn = pyodbc.connect(init_string="driver={SQLOLEDB}; server=+ServerName+; 
database=+MSQLDatabase+; trusted_connection=true")
cursor = conn.cursor()

et obtenez l'erreur suivante

Traceback (most recent call last):
  File "C:\Users...\scrap.py", line 3, in <module>
    conn = pyodbc.connect(init_string="driver={SQLOLEDB}; server=+ServerName+; database=+MSQLDatabase+; trusted_connection=true")
pyodbc.Error: ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')

J'ai consulté les publications suivantes et essayé de remplacer mon pilote par {serveur SQL}} et je me suis connecté à l'aide de liens ODBC dans SAS, ce qui est en partie la base de mon code ci-dessus. besoin d'installer quelque chose d'autre.

pyodbc.Error: ('IM002', '[IM002] [unixODBC] [Gestionnaire de pilotes] Le nom de la source de données est introuvable et aucun pilote par défaut spécifié (0) (SQLDriverConnect)')

Pyodbc - "Nom de la source de données introuvable, et aucun pilote par défaut spécifié"

Merci

69
Christopher Ell

Voici comment je le fais ...

import pyodbc 
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                      "Server=server_name;"
                      "Database=db_name;"
                      "Trusted_Connection=yes;")


cursor = cnxn.cursor()
cursor.execute('SELECT * FROM Table')

for row in cursor:
    print('row = %r' % (row,))

Sources pertinentes:

113
asher

Ajout mineur à ce qui a été dit auparavant. Vous souhaitez probablement renvoyer une image de données. Cela se ferait comme

import pypyodbc 
import pandas as pd

cnxn = pypyodbc.connect("Driver={SQL Server Native Client 11.0};"
                        "Server=server_name;"
                        "Database=db_name;"
                        "uid=User;pwd=password")
df = pd.read_sql_query('select * from table', cnxn)
41
Keith

Dans les connexions à une source de données entre un client et un serveur, il existe deux types généraux: ODBC qui utilise un PILOTE et OLEDB qui utilise un FOURNISSEUR. Et dans le monde de la programmation, il s'agit d'un débat régulier quant à la route à suivre pour la connexion aux sources de données.

Vous utilisez un fournisseur, SQLOLEDB, mais vous le spécifiez en tant que pilote. Autant que je sache, ni les modules pyodbc ni pypyodbc ne prennent en charge les connexions Windows OLEDB. Toutefois, le adodbapi utilise le Microsoft ADO en tant que composant sous-jacent.

Vous trouverez ci-dessous les deux approches pour vos paramètres de connexion. En outre, je format de chaîne vos variables car votre concaténation n'a pas correctement cassé les guillemets dans la chaîne. Vous remarquerez que je double les accolades puisqu'il est nécessaire dans la chaîne de connexion et que string.format() l'utilise également.

# PROVIDER
import adodbapi
conn = adodbapi.connect("PROVIDER=SQLOLEDB;Data Source={0};Database={1}; \
       trusted_connection=yes;UID={2};PWD={3};".format(ServerName,MSQLDatabase,username,password))
cursor = conn.cursor()

# DRIVER
import pyodbc
conn = pyodbc.connect("DRIVER={{SQL Server}};SERVER={0}; database={1}; \
       trusted_connection=yes;UID={2};PWD={3}".format(ServerName,MSQLDatabase,username,password))
cursor = conn.cursor()
31
Parfait

Je préfère cette façon ... c'était beaucoup plus facile

http://www.pymssql.org/en/stable/pymssql_examples.html

conn = pymssql.connect("192.168.10.198", "odoo", "secret", "EFACTURA")
cursor = conn.cursor()
cursor.execute('SELECT * FROM usuario')
13
Franco

Voici quelques photos pour les débutants.

enter image description here

5
Andrew

Suivre le code Python a fonctionné pour moi. Pour vérifier la connexion ODBC, j'ai d'abord créé une application console C # à 4 lignes, comme indiqué ci-dessous.

Code Python

import pandas as pd
import pyodbc 
cnxn = pyodbc.connect("Driver={SQL Server};Server=serverName;UID=UserName;PWD=Password;Database=RCO_DW;")
df = pd.read_sql_query('select TOP 10 * from dbo.Table WHERE Patient_Key > 1000', cnxn)
df.head()

Appel d'une procédure stockée

 dfProcResult = pd.read_sql_query('exec dbo.usp_GetPatientProfile ?', cnxn, params=['MyParam'] )

programme C # à vérifier ODBC connexion

    static void Main(string[] args)
    {
        string connectionString = "Driver={SQL Server};Server=serverName;UID=UserName;PWD=Password;Database=RCO_DW;";
        OdbcConnection cn = new OdbcConnection(connectionString);
        cn.Open();
        cn.Close();
    }
2
Lijo

Essayez d’utiliser des pytd, cela fonctionne dans un environnement plus complexe que pyodbc et plus facile à installer.

Je l'ai fait fonctionner sur Ubuntu 18.04

Réf.: https://github.com/denisenkom/pytds

Exemple de code dans la documentation:

import pytds
with pytds.connect('server', 'database', 'user', 'password') as conn:
    with conn.cursor() as cur:
        cur.execute("select 1")
        cur.fetchall()
2
Alfred Huang

Une autre approche serait installation Microsoft ODBC Pilote 13, puis remplacez SQLOLEDB par ODBC Driver 13 for SQL Server

Cordialement.

0
mondieki