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

Christopher Ell
la source

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:

CENDRE
la source
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)
Keith
la source
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()
Parfait
la source
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
15

Je préfère de 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')
Franco
la source
3
Ce projet a été interrompu: github.com/pymssql/pymssql
Pablo EM
MAIS! à partir d'août 2020, il n'est plus amorti. vous pouvez voir que le dépôt est à nouveau actif: github.com/pymssql/pymssql
deweydb
13

Voici quelques photos pour les débutants.

entrez la description de l'image ici

Andrew
la source
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()
Alfred Huang
la source
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();
    }
LCJ
la source
0

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

Cordialement.

mondieki
la source
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))
James
la source
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

Karl
la source
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
José Garcia
la source
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")
SRK_124
la source
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.)
Milovan Tomašević
la source