本文實(shí)例講述了Python操作Sql Server 2008數(shù)據(jù)庫(kù)的方法。分享給大家供大家參考,具體如下:
最近由于公司的一個(gè)項(xiàng)目需要,需要使用Sql Server 2008數(shù)據(jù)庫(kù),開(kāi)發(fā)語(yǔ)言使用Python,并基于windows平臺(tái)上的Wing IDE4.0進(jìn)行。
之前并未使用過(guò)Sql Server數(shù)據(jù)庫(kù),這次也當(dāng)作一次練手,并把這次數(shù)據(jù)庫(kù)前期開(kāi)發(fā)過(guò)程中遇到的一些問(wèn)題進(jìn)行記錄。
一、關(guān)于pyodbc庫(kù)和pymssql庫(kù)的選擇
在使用python語(yǔ)言進(jìn)行開(kāi)發(fā)之前,需要確定使用哪種第三方的數(shù)據(jù)庫(kù)操作接口,目前Python提供了一些庫(kù),如pymssql和pyodbc,目前網(wǎng)上資料比較多的也是這兩個(gè)了。剛開(kāi)始我嘗試安裝并使用了pymssql庫(kù),但是始終無(wú)法通過(guò)python應(yīng)用程序遠(yuǎn)程訪問(wèn)連接Sql Server數(shù)據(jù)庫(kù),由于對(duì)windows平臺(tái)又不太熟悉,網(wǎng)上查了一些資料未果,說(shuō)是需要依賴feeds,還需要設(shè)置各種變量等,最終我放棄了它改用pyodbc,雖然也遇到一些小問(wèn)題,但是總體來(lái)說(shuō)非常順利。
二、關(guān)于pyodbc庫(kù)的一些接口說(shuō)明
基于第三方python庫(kù)來(lái)訪問(wèn)Sql Server數(shù)據(jù)庫(kù)的過(guò)程非常簡(jiǎn)單(其實(shí)除了能訪問(wèn)sql server外,它還可以訪問(wèn)其它數(shù)據(jù)庫(kù),因?yàn)樗鼈兌蓟跇?biāo)準(zhǔn)的DB-API2.0標(biāo)準(zhǔn)),總共只需要四步:打開(kāi)并連接數(shù)據(jù)庫(kù)connect、 獲取游標(biāo)指針、執(zhí)行數(shù)據(jù)庫(kù)sql操作、關(guān)閉數(shù)據(jù)庫(kù)連接
1 打開(kāi)連接數(shù)據(jù)庫(kù)
或者是:
這里簡(jiǎn)單說(shuō)明一下參數(shù):
DRIVER='{SQL Server}'這個(gè)一般是固定的,除非你在Sql Server作了更改。
SERVER:此參數(shù)為數(shù)據(jù)庫(kù)服務(wù)器名稱,不是"192.168.0.X"這種,一般在安裝時(shí)命名好了,我的是:ZHANGHUAMIN/MSSQLSERVER_ZHM
DATABASE:此參數(shù)指的是Sql Server內(nèi)具體的數(shù)據(jù)庫(kù)了,使用這個(gè)connect接口連接之前在sqlserver內(nèi)應(yīng)該是已經(jīng)先創(chuàng)建好并存在的,否則連接不上。
UID:用戶名
PWD:密碼
執(zhí)行完畢后,如果成功將返回一個(gè)數(shù)據(jù)庫(kù)連接句柄。
2 獲取游標(biāo)指針
cursor = cnxn.cursor()
后面對(duì)數(shù)據(jù)庫(kù)執(zhí)行的sql語(yǔ)句將使用游標(biāo)指針來(lái)操作
3 執(zhí)行數(shù)據(jù)庫(kù)sql操作
cursor.execute("select user_id, user_name from users") #調(diào)用游標(biāo)指針的execute方法執(zhí)行sql語(yǔ)句row = cursor.fetchone() #sql語(yǔ)句執(zhí)行結(jié)果的獲取,如果需要一次獲取多條記錄,可以使用cursor.fetchall()方法if row: print row有時(shí)對(duì)數(shù)據(jù)庫(kù)執(zhí)行完sql語(yǔ)句后需要對(duì)此事務(wù)進(jìn)行提交,使用如下接口:
cnxn.commit()
特別是當(dāng)創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)或數(shù)據(jù)表,若未進(jìn)行提交事務(wù),在Sql Server2008終端上將找不到創(chuàng)建的數(shù)據(jù)庫(kù)及數(shù)據(jù)表,如果提交后,在sql server2008通過(guò)終端的查詢sql 語(yǔ)句就可以即時(shí)查到。注:提交事務(wù)的commit方法屬于數(shù)據(jù)庫(kù)的連接句柄對(duì)象
4 關(guān)閉數(shù)據(jù)庫(kù)連接
cnxn.close()
與文件操作類似,不再說(shuō)明。
三、用python操作Sql Server 2008數(shù)據(jù)庫(kù)的具體例程
#!/usr/bin/python#coding=utf-8#-------------------------------------------------------------------------------# Name: datamapper.py# Purpose: using pyodbc library to operate database## Author: huamin.zhang## Created: 20/04/2013#-------------------------------------------------------------------------------import pyodbcimport timeclass ODBC_MS: ''''' 對(duì)pyodbc庫(kù)的操作進(jìn)行簡(jiǎn)單封裝 pyodbc庫(kù)的下載地址:http://code.google.com/p/pyodbc/downloads/list 使用該庫(kù)時(shí),需要在Sql Server Configuration Manager里面將TCP/IP協(xié)議開(kāi)啟 此類完成對(duì)數(shù)據(jù)庫(kù)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ù)庫(kù)操作指針 cur.execute(sql)#通過(guò)指針來(lái)執(zhí)行sql指令 ret = cur.fetchall()#通過(guò)指針來(lái)獲取sql指令響應(yīng)數(shù)據(jù) cur.close()#游標(biāo)指標(biāo)關(guān)閉 self.conn.close()#關(guān)閉數(shù)據(jù)庫(kù)連接 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()#連接句柄來(lái)提交 cur.close() self.conn.close()def main(): ms = ODBC_MS('{SQL SERVER}', r'ZHANGHUAMIN/MSSQLSERVER_ZHM', 'zhm_db', 'sa', 'wa1234')#zhm_db數(shù)據(jù)庫(kù)是在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í),自增長(zhǎng)度不能夠?qū)懭? sql = u'''''insert into Customers_test ( CustomerName, Address1, Address2, City, State, Zip, Contact, Phone, FedIDNo, DateInSystem ) VALUES ( 'zhm', '北京市朝陽(yáng)區(qū)', '北京市朝陽(yáng)區(qū)', '北京', '哈哈','3625514', '18001226509', '010-88765879', '21', '2012-09-09' ); ''' ms.ExecNoQuery(sql)if __name__ == '__main__': main() 說(shuō)明:我之前連接了一個(gè)Sql Server自帶的AdventureWorks2008數(shù)據(jù)庫(kù)例程,并在其中創(chuàng)建了一個(gè)如上數(shù)據(jù)表Customers_test,然后插入一條如上記錄,結(jié)果在Sql Server2008的終端上用Select * FROM Customers_test查詢,結(jié)果對(duì)包含中文信息字段的數(shù)據(jù)變成如“??????”的亂碼,經(jīng)過(guò)倒騰了一上午,唯一可能解釋的原因可能在于AdventureWorks2008數(shù)據(jù)庫(kù)做了一些我不知道的約束,中文所對(duì)應(yīng)的編碼它不支持。 因?yàn)樵谌缟侠讨校易约簞?chuàng)建的zhm_db數(shù)據(jù)庫(kù),并在其中創(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)通過(guò)終端使用SELECT * FROM Customers_test顯示的結(jié)果如下:
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選