2015-11-15 130 views
20

我正嘗試通過python連接到SQL以在Microsoft SQL服務器上的某些SQL數據庫上運行一些查詢。從我的在線研究和論壇上看,最有前途的圖書館似乎是pyodbc。所以我做了下面的代碼使用Python連接到Microsoft SQL服務器

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

,並出現以下錯誤

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

我已經看過了如下因素的帖子,並試圖改變我的司機{SQL服務器},並使用ODBC鏈接之前已連接在SAS中,這部分是我上面的代碼所基於的,所以不要以爲我需要安裝其他任何東西。

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"

由於

回答

34

這是我要做的事......

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

相關人士透露:

14

在客戶機和服務器之間的數據源的連接有兩種一般類型:ODBC它使用一個驅動器和OLEDB其使用PROVIDER。而在編程領域,關於連接數據源的路線是regular debate

您正在使用提供程序,SQLOLEDB,但將其指定爲驅動程序。據我所知,pyodbc和pypyodbc模塊都不支持Window OLEDB連接。但是,adodbapi會將Microsoft ADO用作基礎組件。

下面是您的連接參數的兩種方法。另外,我的string format作爲串聯你的變量沒有正確地打破字符串內的引號。你會注意到我把花括號加倍,因爲它在連接字符串中是需要的,並且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

感謝和代碼,我得到了一個司機的工作。儘管我必須擺脫.format(...)並將變量放在適當的位置。這種格式意味着什麼? –

+0

您需要安裝'adodbapi'才能使用OLEDB連接。字符串格式是將變量傳遞到字符串而不是使用'+'運算符的推薦方式。帶數字的大括號是'format()'相應填充的佔位符。你甚至可以使用'format()'傳入列表和元組。您的原始代碼不會通過引號分隔字符串和變量,因此'+'被視爲字符串的一部分。 – Parfait

+1

雖然這個答案很好,並幫助我解決問題。誰試圖做到這一點,請記住,如果您設置可信連接= yes,並在相同連接字符串中輸入UID/pwd,則可能會得到異常。這是一種或者兩種組合方式,當您使用可信連接時,即使您明確提及UID/PWD,也會使用NT /系統憑證進行身份驗證。 – S4nd33p

1

另一種方法是installing Microsoft ODBC驅動程序13,然後用ODBC Driver 13 for SQL Server

問候代替SQLOLEDB

8

以前所說的小增加。您可能想要返回一個數據框。作爲

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)