python3.5連結SQL2017,讀取資料庫中的資料
之前寫了一個小程式,使用的資料是從資料庫中下載出來的,但是現在想要讓它直接連結上資料庫中,可以直接從資料庫中讀取資料,所以研究了一下python和sql之間的連結。具體如下:
使用的庫為pyodbc
安裝過程自不必多說,和其他庫的安裝一樣
安裝完成後測試過程,在網上找到了好多資料
>>> import pyodbc
>>>cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=192.168.1.100\\sql;DATABASE=testDB;UID=sa;PWD=myPassword')
>>>cursor = cnxn.cursor()
>>>cursor.execute("select * from Tb" )
下面一個一個說一下什麼意思及自己要使用時應注意什麼
第一句import pyodbc
匯入pyodbc庫
第二句
cnxn=pyodbc.connect('DRIVER={SQL Server};SERVER=192.168.1.100\\sql;DATABASE=testDB;UID=sa;PWD=myPassword')
我在這句吃了很多虧,導致了許多莫名其妙的錯誤,下面我們就詳細剖析下這條語句,首先pyodbc.connect()
是連結函式,它傳入一個string型別引數,這個引數會指定連結資料庫的型別DRIVER
,資料庫的名稱DATABASE
,資料庫所屬伺服器SERVER
,使用者名稱UID
PWD
,這些東西對於那些對資料庫瞭解的比較好的童鞋來說應該不成問題,但對我這個半吊子來說這個就是一個大問題,下面就一個個地去找一下這些東西在哪,首先我先說下我的資料庫是SQL2017,我使用的sql manage是Microsoft SQL Server Management Studio 17,在安裝它時會自動安裝一個Native Client,大家可以去控制面板->程式->程式與功能 中搜索Native Client,確認下自己的版本,然後對應下表,將對應的值輸入連結資料庫的型別DRIVER
後邊花括號裡;
- {SQL Server} ————————- released with SQL Server 2000
- {SQL Native Client} —————– released with SQL Server 2005 (also known as
version 9.0) - {SQL Server Native Client 10.0} - released with SQL Server 2008
{SQL Server Native Client 11.0} - released with SQL Server 2012
第二個引數資料庫所屬伺服器
SERVER
的值我查閱的資料大多都是localhost,但是對於我的資料庫卻老是連結不上,所以我只好開啟Microsoft SQL Server Management Studio 17,連線上資料庫,右鍵屬性
紅圈中的值才是伺服器的值,也就是SERVER
的值
第三個引數資料庫的名稱DATABASE
自不必多說,下圖中紅圈的值就是資料庫的名稱
在確定第四個引數和第五個引數的值之前,先看下資料庫是否可以啟用伺服器代理賬戶,還是第一個引數一樣的視窗右鍵->引數->安全性,要確保啟用伺服器代理賬戶項是可以啟動的,如下圖
然後找到物件資源管理器中的資料庫伺服器(第一個引數也在這)一項中的安全性->登入名
右鍵sa->屬性->安全性,輸入密碼,確定。這個使用者sa和密碼就是第四和第五個引數。
這些就是第二條語句中的引數。
第三條語句是建立cursor,沒什麼可說的。
第四條語句就是對資料庫中資料進行操作了,其中的sql語言要寫在execute()函式中,並用雙引號括起來
但是這條語句輸出的卻是
>>> cursor.execute("select name from Database.data")
<pyodbc.Cursor object at 0x000001C421FAFAF8>
要想將它顯示為正常的形式還需要呼叫其它函式fetchone()或者fetchall()。
>>> cursor.fetchall()
[('1haha', ), ('2dada', ), ('3chuachua', ), ('4xixi', ), ('5hehe', ), ('6qieqie', ), ('7lele', ), ('8lala', )]
成功!
如果是對資料庫中資料進行增刪修改等其它操作時,還要記得用函式commit()對操作提交一下。
>>> cursor.execute("delect from Database.data where name = '4xixi' ")
>>> cnxn.commit()