2015-11-15 56 views
20

Próbuję połączyć się z SQL za pomocą Pythona, aby uruchomić niektóre zapytania w niektórych bazach danych SQL na serwerze Microsoft SQL. Z moich badań online i na tym forum najbardziej obiecująca biblioteka wydaje się być pyodbc. Więc zrobiłem następujący kodŁączenie się z serwerem Microsoft SQL przy użyciu Pythona

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

i pojawia się następujący błąd

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

Mam spojrzał na następujace stanowiska i próbowali zmiany mojego kierowcę {SQL Server} i podłączonego przy użyciu łącza ODBC przed w SAS, który jest częściowo tym, na którym opiera się mój powyższy kod, więc nie myśl, że muszę zainstalować cokolwiek innego.

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"

Dzięki

Odpowiedz

34

To jak to zrobić ...

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

Istotne źródła:

14

W połączeniach źródłowych danych między klientem a serwerem są dwa ogólne typy: ODBC, który korzysta z usług kierowcy i OLEDB który używa dostawcy. W świecie programowania jest to regular debate, która trasa ma być połączona ze źródłami danych.

Używasz dostawcy, SQLOLEDB, ale określasz go jako sterownik. O ile mi wiadomo, żaden z modułów pyodbc ani pypyodbc nie obsługuje połączeń Window OLEDB. Jednak adodbapi nie używa Microsoft ADO jako podstawowego składnika.

Poniżej przedstawiono oba podejścia do parametrów połączenia. Również I string format zmienne, ponieważ konkatenacja nie spowodowała prawidłowego podzielenia cudzysłowów w ciągu znaków. Zauważysz, że podwajałem nawiasy klamrowe, ponieważ jest to potrzebne w łańcuchu połączeń i używa go również 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

Dzięki za wyjaśnienie i kod mam sterownik jeden do pracy. Chociaż musiałem pozbyć się .format (...) i umieść zmienne w odpowiednich miejscach. Jaki miał być format? –

+0

Musisz zainstalować 'adodbapi', aby użyć połączenia OLEDB. Format ciągów jest zalecanym sposobem przekazywania zmiennych w łańcuchu zamiast używania operatora '+'. Kręcone nawiasy z liczbami są symbolami zastępczymi, które 'format()' odpowiednio wypełnia. Możesz nawet przekazywać listy i krotki używając 'format()'. Twój oryginalny kod nie przerwał ciągu znaków i zmiennych przez cudzysłowy, więc '+' było uważane za część ciągu. – Parfait

+1

Ta odpowiedź jest świetna i pomogła mi rozwiązać problem. ktokolwiek próbuje to zrobić, pamiętaj, że możesz otrzymać wyjątek, jeśli ustawisz zaufane połączenie = tak i wprowadzisz UID/pwd w tym samym ciągu połączenia. Jest to jedna lub żadna kombinacja, a podczas korzystania z zaufanego połączenia twoje poświadczenia NT/systemu są używane do uwierzytelniania, nawet jeśli wyraźnie wymieniasz UID/PWD. – S4nd33p

1

Alternatywnym rozwiązaniem byłoby installing Microsoft ODBC 13, a następnie zastąpić SQLOLEDB z ODBC Driver 13 for SQL Server

Pozdrawiam.

8

Drobny dodatek do tego, co zostało powiedziane wcześniej. Prawdopodobnie chcesz zwrócić ramkę danych. Robi się to jak

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) 
Powiązane problemy