Python操作Sql Server 2008數(shù)據(jù)庫的方法詳解
本文實(shí)例講述了Python操作Sql Server 2008數(shù)據(jù)庫的方法。分享給大家供大家參考,具體如下:
最近由于公司的一個(gè)項(xiàng)目需要,需要使用Sql Server 2008數(shù)據(jù)庫,開發(fā)語言使用Python,并基于windows平臺上的Wing IDE4.0進(jìn)行。
之前并未使用過Sql Server數(shù)據(jù)庫,這次也當(dāng)作一次練手,并把這次數(shù)據(jù)庫前期開發(fā)過程中遇到的一些問題進(jìn)行記錄。
一、關(guān)于pyodbc庫和pymssql庫的選擇
在使用python語言進(jìn)行開發(fā)之前,需要確定使用哪種第三方的數(shù)據(jù)庫操作接口,目前Python提供了一些庫,如pymssql和pyodbc,目前網(wǎng)上資料比較多的也是這兩個(gè)了。剛開始我嘗試安裝并使用了pymssql庫,但是始終無法通過python應(yīng)用程序遠(yuǎn)程訪問連接Sql Server數(shù)據(jù)庫,由于對windows平臺又不太熟悉,網(wǎng)上查了一些資料未果,說是需要依賴feeds,還需要設(shè)置各種變量等,最終我放棄了它改用pyodbc,雖然也遇到一些小問題,但是總體來說非常順利。
二、關(guān)于pyodbc庫的一些接口說明
基于第三方python庫來訪問Sql Server數(shù)據(jù)庫的過程非常簡單(其實(shí)除了能訪問sql server外,它還可以訪問其它數(shù)據(jù)庫,因?yàn)樗鼈兌蓟跇?biāo)準(zhǔn)的DB-API2.0標(biāo)準(zhǔn)),總共只需要四步:打開并連接數(shù)據(jù)庫connect、 獲取游標(biāo)指針、執(zhí)行數(shù)據(jù)庫sql操作、關(guān)閉數(shù)據(jù)庫連接
1 打開連接數(shù)據(jù)庫
或者是:
這里簡單說明一下參數(shù):
DRIVER='{SQL Server}'
這個(gè)一般是固定的,除非你在Sql Server作了更改。
SERVER:此參數(shù)為數(shù)據(jù)庫服務(wù)器名稱,不是"192.168.0.X"這種,一般在安裝時(shí)命名好了,我的是:ZHANGHUAMIN\MSSQLSERVER_ZHM
DATABASE:此參數(shù)指的是Sql Server內(nèi)具體的數(shù)據(jù)庫了,使用這個(gè)connect接口連接之前在sqlserver內(nèi)應(yīng)該是已經(jīng)先創(chuàng)建好并存在的,否則連接不上。
UID:用戶名
PWD:密碼
執(zhí)行完畢后,如果成功將返回一個(gè)數(shù)據(jù)庫連接句柄。
2 獲取游標(biāo)指針
cursor = cnxn.cursor()
后面對數(shù)據(jù)庫執(zhí)行的sql語句將使用游標(biāo)指針來操作
3 執(zhí)行數(shù)據(jù)庫sql操作
cursor.execute("select user_id, user_name from users") #調(diào)用游標(biāo)指針的execute方法執(zhí)行sql語句 row = cursor.fetchone() #sql語句執(zhí)行結(jié)果的獲取,如果需要一次獲取多條記錄,可以使用cursor.fetchall()方法 if row: print row
有時(shí)對數(shù)據(jù)庫執(zhí)行完sql語句后需要對此事務(wù)進(jìn)行提交,使用如下接口:
cnxn.commit()
特別是當(dāng)創(chuàng)建一個(gè)數(shù)據(jù)庫或數(shù)據(jù)表,若未進(jìn)行提交事務(wù),在Sql Server2008終端上將找不到創(chuàng)建的數(shù)據(jù)庫及數(shù)據(jù)表,如果提交后,在sql server2008通過終端的查詢sql 語句就可以即時(shí)查到。注:提交事務(wù)的commit
方法屬于數(shù)據(jù)庫的連接句柄對象
4 關(guān)閉數(shù)據(jù)庫連接
cnxn.close()
與文件操作類似,不再說明。
三、用python操作Sql Server 2008數(shù)據(jù)庫的具體例程
#!/usr/bin/python #coding=utf-8 #------------------------------------------------------------------------------- # Name: datamapper.py # Purpose: using pyodbc library to operate database # # Author: huamin.zhang # # Created: 20/04/2013 #------------------------------------------------------------------------------- import pyodbc import time class ODBC_MS: ''''' 對pyodbc庫的操作進(jìn)行簡單封裝 pyodbc庫的下載地址:http://code.google.com/p/pyodbc/downloads/list 使用該庫時(shí),需要在Sql Server Configuration Manager里面將TCP/IP協(xié)議開啟 此類完成對數(shù)據(jù)庫DB的連接/查詢/執(zhí)行操作 正確的連接方式如下: cnxn = pyodbc.connect('DRIVER={SQL SERVER};SERVER=ZHANGHUAMIN\MSSQLSERVER_ZHM;DATABASE=AdventureWorks2008;UID=sa;PWD=wa1234') cnxn = pyodbc.connect(DRIVER='{SQL SERVER}',SERVER=r'ZHANGHUAMIN\MSSQLSERVER_ZHM',DATABASE='AdventureWorks2008',UID='sa',PWD='wa1234',charset="utf-8") ''' def __init__(self, DRIVER,SERVER, DATABASE, UID, PWD): ''''' initialization ''' self.DRIVER = DRIVER self.SERVER = SERVER self.DATABASE = DATABASE self.UID = UID self.PWD = PWD def __GetConnect(self): ''''' Connect to the DB ''' if not self.DATABASE: raise(NameError,"no setting db info") self.conn = pyodbc.connect(DRIVER=self.DRIVER, SERVER=self.SERVER, DATABASE=self.DATABASE, UID=self.UID, PWD=self.PWD, charset="UTF-8") #self.conn = pyodbc.connect(DRIVER=self.DRIVER, SERVER=self.SERVER, DATABASE=self.DATABASE, UID=self.UID, PWD=self.PWD) cur = self.conn.cursor() if not cur: raise(NameError,"connected failed!") else: return cur def ExecQuery(self, sql): ''''' Perform one Sql statement ''' cur = self.__GetConnect() #建立鏈接并創(chuàng)建數(shù)據(jù)庫操作指針 cur.execute(sql)#通過指針來執(zhí)行sql指令 ret = cur.fetchall()#通過指針來獲取sql指令響應(yīng)數(shù)據(jù) cur.close()#游標(biāo)指標(biāo)關(guān)閉 self.conn.close()#關(guān)閉數(shù)據(jù)庫連接 return ret def ExecNoQuery(self,sql): ''''' Person one Sql statement like write data, or create table, database and so on''' cur = self.__GetConnect() cur.execute(sql) self.conn.commit()#連接句柄來提交 cur.close() self.conn.close() def main(): ms = ODBC_MS('{SQL SERVER}', r'ZHANGHUAMIN\MSSQLSERVER_ZHM', 'zhm_db', 'sa', 'wa1234')#zhm_db數(shù)據(jù)庫是在sql server 終端里先創(chuàng)建好的 #ms.ExecNoQuery("drop table Customers_test") sql = '''''CREATE TABLE Customers_test ( CustomerNo int IDENTITY NOT NULL, CustomerName varchar(30) NOT NULL, Address1 nvarchar(30) NOT NULL , Address2 nvarchar(30) NOT NULL, City nvarchar(20) NOT NULL, State nchar(20) NOT NULL, Zip varchar(10) NOT NULL, Contact varchar(25) NOT NULL, Phone char(15) NOT NULL, FedIDNo varchar(9) NOT NULL, DateInSystem smalldatetime NOT NULL );''' ms.ExecNoQuery(sql) #注意:在進(jìn)行插入操作時(shí),自增長度不能夠?qū)懭? sql = u'''''insert into Customers_test ( CustomerName, Address1, Address2, City, State, Zip, Contact, Phone, FedIDNo, DateInSystem ) VALUES ( 'zhm', '北京市朝陽區(qū)', '北京市朝陽區(qū)', '北京', '哈哈','3625514', '18001226509', '010-88765879', '21', '2012-09-09' ); ''' ms.ExecNoQuery(sql) if __name__ == '__main__': main()
說明:我之前連接了一個(gè)Sql Server自帶的AdventureWorks2008數(shù)據(jù)庫例程,并在其中創(chuàng)建了一個(gè)如上數(shù)據(jù)表Customers_test,然后插入一條如上記錄,結(jié)果在Sql Server2008的終端上用Select * FROM Customers_test
查詢,結(jié)果對包含中文信息字段的數(shù)據(jù)變成如“??????”的亂碼,經(jīng)過倒騰了一上午,唯一可能解釋的原因可能在于AdventureWorks2008數(shù)據(jù)庫做了一些我不知道的約束,中文所對應(yīng)的編碼它不支持。 因?yàn)樵谌缟侠讨?,我自己?chuàng)建的zhm_db數(shù)據(jù)庫,并在其中創(chuàng)建數(shù)據(jù)表,然后插入記錄,同樣的在Sql Server終端里用select查詢,中文也是可以正常顯示的。
注意,在python程序中需要增加:#coding = utf-8
編碼,并在連接connect內(nèi)增加charset = "utf-8"
指明字符集為utf-8編碼即可。這樣可以防止亂碼的出現(xiàn)
最后在Sql Server 2008內(nèi)通過終端使用SELECT * FROM Customers_test
顯示的結(jié)果如下:
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python常見數(shù)據(jù)庫操作技巧匯總》、《Python編碼操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python實(shí)現(xiàn)繪圖散點(diǎn)圖(scatter)
這篇文章主要介紹了Python實(shí)現(xiàn)繪圖散點(diǎn)圖方式(scatter),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06python字符串駐留機(jī)制的使用范圍知識點(diǎn)詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python字符串駐留機(jī)制的使用范圍相關(guān)知識點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-09-09Python實(shí)現(xiàn)剪刀石頭布小游戲(與電腦對戰(zhàn))
這篇文章給大家分享Python基礎(chǔ)實(shí)現(xiàn)與電腦對戰(zhàn)的剪刀石頭布小游戲,練習(xí)if while輸入和輸出,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-12-12Python實(shí)現(xiàn)對excel文件列表值進(jìn)行統(tǒng)計(jì)的方法
這篇文章主要介紹了Python實(shí)現(xiàn)對excel文件列表值進(jìn)行統(tǒng)計(jì)的方法,涉及Python基于win32com組件操作表格文件的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07