Herstellen einer Verbindung zum Microsoft SQL Server mit Python

97

Ich versuche, über Python eine Verbindung zu SQL herzustellen, um einige Abfragen in einigen SQL-Datenbanken auf Microsoft SQL Server auszuführen. Aus meiner Online-Recherche und in diesem Forum geht hervor, dass die vielversprechendste Bibliothek pyodbc ist. Also habe ich den folgenden Code gemacht

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

und erhalte den folgenden Fehler

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

Ich habe mir die folgenden Beiträge angesehen und versucht, meinen Treiber auf {SQL Server} zu ändern, und habe zuvor in SAS eine Verbindung über ODBC-Links hergestellt. Dies ist teilweise der Grund, auf dem mein obiger Code basiert. Ich glaube also nicht, dass ich etwas anderes installieren muss.

pyodbc.Error: ('IM002', '[IM002] [unixODBC] [Treibermanager] Datenquellenname nicht gefunden und kein Standardtreiber angegeben (0) (SQLDriverConnect)')

Pyodbc - "Datenquellenname nicht gefunden und kein Standardtreiber angegeben"

Vielen Dank

Christopher Ell
quelle

Antworten:

144

So mache ich das ...

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

Relevante Ressourcen:

ASCHE
quelle
60

Kleinere Ergänzung zu dem, was zuvor gesagt wurde. Sie möchten wahrscheinlich einen Datenrahmen zurückgeben. Dies würde als getan werden

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
quelle
38

Bei Datenquellenverbindungen zwischen einem Client und einem Server gibt es zwei allgemeine Typen: ODBC, das einen DRIVER verwendet, und OLEDB, das einen PROVIDER verwendet. In der Programmierwelt wird regelmäßig darüber diskutiert , welchen Weg die Verbindung zu Datenquellen einschlagen soll.

Sie verwenden einen Anbieter, geben SQLOLEDBihn jedoch als Treiber an. Soweit ich weiß, unterstützen weder das pyodbc- noch das pypyodbc-Modul Windows OLEDB-Verbindungen. Das Adodbapi verwendet jedoch Microsoft ADO als zugrunde liegende Komponente.

Nachfolgend finden Sie beide Ansätze für Ihre Verbindungsparameter. Außerdem formatiere ich Ihre Variablen als Zeichenfolge , da Ihre Verkettung Anführungszeichen innerhalb der Zeichenfolge nicht richtig gebrochen hat. Sie werden feststellen, dass ich die geschweiften Klammern verdopple, da sie in der Verbindungszeichenfolge benötigt werden und string.format()auch verwendet werden.

# 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
quelle
Vielen Dank für die Erklärung und den Code. Ich habe den Treiber zum Laufen gebracht. Obwohl ich das .format (...) loswerden und die Variablen an den richtigen Stellen platzieren musste. Was sollte das Format tun?
Christopher Ell
1
Sie müssen installieren adodbapi, um die OLEDB-Verbindung verwenden zu können. Das Zeichenfolgenformat ist die empfohlene Methode, um Variablen an eine Zeichenfolge zu übergeben, anstatt den +Operator zu verwenden. Die geschweiften Klammern mit Zahlen sind Platzhalter, die entsprechend format()ausgefüllt werden. Sie können sogar Listen und Tupel mit übergeben format(). Ihr ursprünglicher Code hat Zeichenfolgen und Variablen nicht in Anführungszeichen gesetzt und wurde daher +als Teil der Zeichenfolge betrachtet.
Parfait
4
Diese Antwort ist zwar großartig und hat mir geholfen, das Problem zu lösen. Wer dies versucht, denkt daran, dass Sie möglicherweise eine Ausnahme erhalten, wenn Sie die vertrauenswürdige Verbindung = yes setzen und die UID / pwd in dieselbe Verbindungszeichenfolge eingeben. Dies ist eine Entweder-Oder-Kombination. Wenn Sie eine vertrauenswürdige Verbindung verwenden, wird Ihr NT / System-Berechtigungsnachweis zur Authentifizierung verwendet, auch wenn Sie UID / PWD explizit erwähnen.
S4nd33p
15

Ich bevorzuge diesen Weg ... es war viel einfacher

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
quelle
3
Dieses Projekt wurde eingestellt: github.com/pymssql/pymssql
Pablo EM
ABER! ab August 2020 wird es nicht mehr abgeschrieben. Sie können sehen, dass das Repo wieder aktiv ist: github.com/pymssql/pymssql
deweydb
13

Hier sind einige Bilder für Neulinge.

Geben Sie hier die Bildbeschreibung ein

Andrew
quelle
4

Versuchen Sie es mit Pytds. Es funktioniert in Umgebungen mit einer höheren Komplexität als pyodbcund ist einfacher einzurichten.

Ich habe es unter Ubuntu 18.04 zum Laufen gebracht

Ref: https://github.com/denisenkom/pytds

Beispielcode in der Dokumentation:

import pytds
with pytds.connect('server', 'database', 'user', 'password') as conn:
    with conn.cursor() as cur:
        cur.execute("select 1")
        cur.fetchall()
Alfred Huang
quelle
1
Danke dir. Funktioniert wie ein Zauber ohne komplexe Einrichtung.
Shubham Patel
3

Der folgende Python-Code hat bei mir funktioniert. Um die ODBC-Verbindung zu überprüfen, habe ich zuerst eine 4-zeilige C # -Konsolenanwendung erstellt, wie unten aufgeführt.

Python-Code

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

Aufrufen einer gespeicherten Prozedur

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

C # -Programm zum Überprüfen der ODBC-Verbindung

    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
quelle
0

Ein alternativer Ansatz wäre die Installation von Treiber 13 Microsoft ODBC, dann ersetzen SQLOLEDBmitODBC Driver 13 for SQL Server

Grüße.

mondieki
quelle
0

Hier ist die, die für mich funktioniert:

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
quelle
0

Ich habe hier aktuelle Ressourcen gefunden: Microsoft | SQL Docs | Python SQL-Treiber

Es werden diese beiden Optionen erläutert, einschließlich aller erforderlichen Voraussetzungen und Codebeispiele: Python SQL-Treiber - pyodbc (getestet und funktionsfähig) Python SQL-Treiber - pymssql

Karl
quelle
Hallo - Willkommen bei Stack Overflow - Sie sollten versuchen, die Frage mit einigen Ideen zu beantworten (in diesem Fall mit neuen Ideen) - mit einem Teil Ihres eigenen Codes oder einem neuen Ansatz. Verwenden Sie dann einige Links, um weitere Hilfe bereitzustellen oder Ihre Lösung zu sichern. Sie sollten nicht nur einige Links posten.
Alex Leo
0

Meine Version. Ich hoffe es hilft.


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
Jose Garcia
quelle
0

Ich habe versucht, SQL Server auf folgende Weise zu verbinden, und diese funktionierten für mich.

So stellen Sie eine Verbindung mithilfe der Windows-Authentifizierung her

import pyodbc

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

Um die SQL Server-Authentifizierung zu verwenden, habe ich folgenden Code verwendet.

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
quelle