2015-11-15 59 views
20

Sto provando a connettermi a SQL tramite python per eseguire alcune query su alcuni database SQL su server Microsoft SQL. Dalla mia ricerca online e su questo forum la libreria più promettente sembra essere pyodbc. Così ho fatto il seguente codiceConnessione al server Microsoft SQL tramite Python

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

e ottenere il seguente errore

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

Ho guardato i posti folowing e provato a cambiare il mio autista a {sql server} e sono collegati mediante link ODBC prima in SAS, che è parzialmente ciò su cui è basato il mio codice precedente, quindi non credo di aver bisogno di installare altro.

pyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)')

Pyodbc - "Data source name not found, and no default driver specified"

Grazie

risposta

34

Questo è come lo faccio ...

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

fonti pertinenti:

14

In connessioni origine dati tra client e server ci sono due tipi generali: ODBC, che utilizza un driver e OLE DB che utilizza un provider. E nel mondo della programmazione, è un regular debate su quale percorso andare per connettersi alle origini dati.

Si sta utilizzando un provider, SQLOLEDB, ma lo si specifica come driver. Per quanto ne so, né i moduli pyodbc né pypyodbc supportano le connessioni OLEDB di Windows. Tuttavia, lo adodbapi utilizza Microsoft ADO come componente sottostante.

Di seguito sono riportati entrambi gli approcci per i parametri di connessione. Inoltre, I string format le variabili come la concatenazione non interrompevano correttamente le virgolette all'interno della stringa. Noterai che raddoppio le parentesi graffe poiché è necessario nella stringa di connessione e lo usa anche string.format().

# 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() 
+0

Grazie per la spiegazione e il codice ho ottenuto il conducente uno a lavorare. Anche se ho dovuto sbarazzarsi di .format (...) e inserire le variabili nei luoghi appropriati. Che cosa doveva fare il formato? –

+0

È necessario installare 'adodbapi' per utilizzare la connessione OLEDB. E il formato stringa è il metodo consigliato per passare variabili in una stringa piuttosto che usare l'operatore '+'. Le parentesi graffe con i numeri sono segnaposto che 'format()' si riempie di conseguenza. Puoi persino passare in liste e tuple usando 'format()'. Il tuo codice originale non ha infranto la stringa e le variabili tra virgolette, quindi '+' è stato considerato parte della stringa. – Parfait

+1

Mentre questa risposta è ottima e mi ha aiutato a risolvere il problema. chiunque stia tentando di farlo ricorda che potresti ottenere un'eccezione se imposti la connessione trusted = yes e inserisci l'UID/pwd nella stessa stringa di connessione. Questa è una combinazione o una combinazione e quando si utilizza una connessione trusted, le credenziali NT/sistema vengono utilizzate per l'autenticazione anche se si menziona esplicitamente UID/PWD. – S4nd33p

1

Un approccio alternativo sarebbe installing Driver Microsoft ODBC 13, quindi sostituire SQLOLEDB con ODBC Driver 13 for SQL Server

saluti.

8

In aggiunta a ciò che è stato detto prima. Probabilmente vuoi restituire un dataframe. Ciò dovrebbe essere fatto come

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) 
Problemi correlati