Connexion au serveur Microsoft SQL à l'aide de Python


97

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 créé 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 regardé les messages suivants et essayé de changer mon pilote en {sql server} et je me suis connecté en utilisant des liens ODBC auparavant dans SAS, ce qui est en partie ce sur quoi mon code ci-dessus est basé, donc je ne pense pas avoir besoin d'installer autre chose.

pyodbc.Error: ('IM002', '[IM002] [unixODBC] [Driver Manager] Nom de la source de données 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

Réponses:


145

C'est comme ça que je 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,))

Ressources pertinentes:


61

Ajout mineur à ce qui a été dit auparavant. Vous souhaitez probablement renvoyer une trame de données. Cela serait fait 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)

38

Dans les connexions de source de données entre un client et un serveur, il existe deux types généraux: ODBC qui utilise un DRIVER et OLEDB qui utilise un PROVIDER. Et dans le monde de la programmation, il y a un débat régulier sur la voie à suivre pour se connecter aux sources de données.

Vous utilisez un fournisseur, SQLOLEDBmais le spécifiez comme pilote. Pour autant que je sache, ni les modules pyodbc ni pypyodbc ne prennent en charge les connexions Window OLEDB. Cependant, l' adodbapi fait qui utilise Microsoft ADO comme composant sous-jacent.

Vous trouverez ci-dessous les deux approches pour vos paramètres de connexion. De plus, je formate vos variables car votre concaténation ne rompt pas correctement les guillemets dans la chaîne. Vous remarquerez que je double les accolades car il est nécessaire dans la chaîne de connexion et l' string.format()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()

Merci pour l'explication et le code, j'ai fait fonctionner le pilote. Bien que je devais me débarrasser du .format (...) et mettre les variables aux bons endroits. Quel était le but du format?
Christopher Ell

1
Vous devez installer adodbapipour utiliser la connexion OLEDB. Et le format de chaîne est le moyen recommandé pour passer des variables dans une chaîne plutôt que d'utiliser l' +opérateur. Les accolades avec des nombres sont des espaces réservés qui se format()remplissent en conséquence. Vous pouvez même transmettre des listes et des tuples en utilisant format(). Votre code d'origine ne coupait pas la chaîne et les variables par des guillemets, il +était donc considéré comme faisant partie d'une chaîne.
Parfait du

4
Bien que cette réponse soit excellente et m'a aidé à résoudre le problème. celui qui essaie de le faire se souvient que vous pouvez obtenir une exception si vous définissez la connexion de confiance = yes et entrez l'UID / pwd dans la même chaîne de connexion. Il s'agit d'une combinaison soit / ou et lorsque vous utilisez une connexion approuvée, vos informations d'identification NT / système sont utilisées pour l'authentification même si vous mentionnez explicitement l'UID / PWD.
S4nd33p



4

Essayez d'utiliser pytds, cela fonctionne dans un environnement plus complexe pyodbcet plus facile à configurer.

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()

1
Je vous remercie. Fonctionne comme un charme sans aucune configuration complexe.
Shubham Patel

3

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 # pour vérifier la connexion ODBC

    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();
    }

0

Une autre approche consisterait à installer le pilote Microsoft ODBC 13, puis à le remplacer SQLOLEDBparODBC Driver 13 for SQL Server

Cordialement.


0

voici celui qui fonctionne pour moi:

from sqlalchemy import create_engine
import urllib

conn_str = (
r'Driver=ODBC Driver 13 for SQL Server;'
r'Server=DefinitelyNotProd;'
r'Database=PlayPen;'
r'Trusted_Connection=Yes;')

quoted_conn_str = urllib.parse.quote_plus(conn_str)
engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted_conn_str))

0

J'ai trouvé des ressources à jour ici: Microsoft | Docs SQL | Pilote SQL Python

Il y a ces deux options expliquées, y compris toutes les conditions préalables nécessaires et des exemples de code: Pilote Python SQL - pyodbc (testé et fonctionnel) Pilote Python SQL - pymssql


Salut - Bienvenue dans Stack Overflow - vous devriez viser à répondre à la question avec quelques idées (nouvelles idées dans ce cas) - Certaines de votre propre code ou une nouvelle approche. Ensuite, utilisez quelques liens afin de fournir plus d'aide ou de sauvegarder votre solution. Vous ne devriez pas simplement publier des liens.
Alex Leo le

0

Ma version. J'espère que ça aide.


import pandas.io.sql
import pyodbc
import sys

server = 'example'
db = 'NORTHWND'
db2 = 'example'

#Crear la conexión
conn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + server +
                      ';DATABASE=' + db +
                      ';DATABASE=' + db2 +
                      ';Trusted_Connection=yes')
#Query db
sql = """SELECT [EmployeeID]
      ,[LastName]
      ,[FirstName]
      ,[Title]
      ,[TitleOfCourtesy]
      ,[BirthDate]
      ,[HireDate]
      ,[Address]
      ,[City]
      ,[Region]
      ,[PostalCode]
      ,[Country]
      ,[HomePhone]
      ,[Extension]
      ,[Photo]
      ,[Notes]
      ,[ReportsTo]
      ,[PhotoPath]
  FROM [NORTHWND].[dbo].[Employees] """
data_frame = pd.read_sql(sql, conn)
data_frame

0

J'ai essayé de connecter le serveur SQL de la manière suivante et celles-ci ont fonctionné pour moi.

Pour se connecter à l'aide de l'authentification Windows

import pyodbc

conn = pyodbc.connect('Driver={SQL Server};Server='+servername+';Trusted_Connection=yes;Database='+databasename+';')
cursor = conn.cursor()
cursor.execute("Select 1 as Data")

Pour utiliser l'authentification du serveur SQL, j'ai utilisé le code suivant.

import pyodbc

conn = pyodbc.connect('Driver={SQL Server};Server='+servername+  ';UID='+userid+';PWD='+password+';Database='+databasename) 
cursor1 = conn.cursor()
cursor1.execute("SELECT 1 AS DATA")

0

Essayez avec pymssql:pip install pymssql

import pymssql

try:
    conn = pymssql.connect(server="host_or_ip", user="your_username", password="your_password", database="your_db")
    cursor = conn.cursor()
    cursor.execute ("SELECT @@VERSION")
    row = cursor.fetchone()
    print(f"\n\nSERVER VERSION:\n\n{row[0]}")
    cursor.close()
    conn.close()
except Exception:
    print("\nERROR: Unable to connect to the server.")
    exit(-1)

Production:

SERVER VERSION:

Microsoft SQL Server 2016 (SP2-CU14) (KB4564903) - 13.0.5830.85 (X64)
        Jul 31 2020 18:47:07
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)

La connexion peut également être vérifiée depuis le terminal, avec une seule ligne de code avec sqlcmd. Voir la syntaxe .

╔═════════╦═════════════════════════════════════════╗
 Command                Description               
╠═════════╬═════════════════════════════════════════╣
   -S     [protocol:]server[instance_name][,port] 
   -U     login_id                                
   -p     password                                
   -Q     "cmdline query" (and exit)              
╚═════════╩═════════════════════════════════════════╝
sqlcmd -S "host_or_ip"  -U "your_username" -p -Q "SELECT @@VERSION"

production:

Password:    your_password



--------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2016 (SP2-CU14) (KB4564903) - 13.0.5830.85 (X64) 
        Jul 31 2020 18:47:07 
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)


(1 rows affected)

Network packet size (bytes): 4096
1 xact[s]:
Clock Time (ms.): total         1  avg   1.00 (1000.00 xacts per sec.)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.