Python數據庫連接之------使用pymssql模塊庫連接Sql Server數據庫方法(轉)---》並實現增刪改查!!!實現存儲過程!!!


0,首先在電腦中安裝pymssql庫,該庫可以到這里下載:http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql

---使用該庫時,需要在Sql Server Configuration Manager里面將TCP/IP協議開啟

1,下面是連接和查詢Sql數據庫類(底層訪問類---通用,有了它就可以隨意訪問數據庫了,主要包含一些訪問數據庫的函數):

import pymssql

 

class MSSQL:
    def __init__(self,host,user,pwd,db): #類的構造函數,初始化數據庫連接ip或者域名,以及用戶名,密碼,要連接的數據庫名稱
        self.host=host
        self.user=user
        self.pwd=pwd
        self.db=db
    def __GetConnect(self):  #得到數據庫連接信息函數, 返回: conn.cursor()
        if not self.db:
            rasie(NameError,"沒有設置數據庫信息")
        self.conn=pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset='utf8')
        cur=self.conn.cursor()  #將數據庫連接信息,賦值給cur。
        if not cur:
            raise(NameError,"連接數據庫失敗")
        else:
            return cur

    #執行查詢語句,返回的是一個包含tuple的list,list的元素是記錄行,tuple的元素是每行記錄的字段
    def ExecQuery(self,sql):  #執行Sql語句函數,返回結果
        cur = self.__GetConnect()   #獲得數據庫連接信息
        cur.execute(sql)  #執行Sql語句
        resList = cur.fetchall()  #獲得所有的查詢結果
        #查詢完畢后必須關閉連接
        self.conn.close()   #返回查詢結果
        return resList
    def ExecNonQuery(self,sql):
        cur = self.__GetConnect()
        cur.execute(sql)
        self.conn.commit()
        self.conn.close()

2,下面在函數中,連接數據庫,並執行一個簡單的查詢語句(查):

def main():
    ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong")  #實例化類對象,連接數據對象
    reslist=ms.ExecQuery("select top 10 id,c_value from dbo.bx_categories AS bc")   #調用函數執行查詢語句
    for(id,huiyuancontent) in reslist:     #遍歷返回結果
        print huiyuancontent         #轉換為字符串,打印出來。

 

3,下面是一個超微復雜點的查詢語句(查):

def main():
    ms=MSSQL(host="117.79.156.40",user="wutongview",pwd="*******",db="Wutong")
    lst2=[]  #聲明列表,Python中沒有數組這個概念
    lst=[569454,1405892,1062101,647328,1221889,1255607,1268513,1282851]
    for i in lst:  #遍歷列表
        reslist=ms.ExecQuery("SELECT com_name FROM com WHERE cust_id='"+str(i)+"'")  #Python可以用這種加號拼接,也可以用占位符和format進行字符串格式化拼接
        if len(reslist)==0:   #如果查詢的結果集數組為空,直接添加數據庫查詢結果集,否則,添加結果集中的第一行第一列的值,即reslist[0][0]
            lst2.append(reslist)  
            #print("第一個為空")
            #break   #break可以跳出循環
        else:
            lst2.append(reslist[0][0])  
    return lst2  #返回列表

 

4,下面是插入數據(增)操作:

def insert():
    ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong")
    back_val=ms.ExecNonQuery("INSERT dbo.bx_xyzBackContent ( backmsg, time )   VALUES  ( N'nihaoceshi','2014-04-02 13:55:27')")  #注意,這里back_val為None值。
    return back_val

 

5,下面是刪除(刪)操作:

 def delete():
    ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong")
    back_val=ms.ExecNonQuery("DELETE FROM dbo.bx_xyzBackContent WHERE id='6333'")  #注意,這里back_val為None值。
    return back_val

 

6,下面是更新()操作:

def update():
    ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong")
    back_val=ms.ExecNonQuery("UPDATE dbo.bx_xyzBackContent SET backmsg='nihaotest' WHERE id=6331")   #注意,這里back_val為None值。
    return back_val

 

7,執行存儲過程:

cur.execute("exec 存儲過程名 @參數1=XXX, @參數2='YYY'......")

***一個真實的案例:

def main():
    ms=MSSQL(host="192.168.0.156",user="view",pwd="*********",db="Wutong")  
    reslist=ms.ExecQuery("exec SearchBshi @fromProvince='',@fromCity='',@fromArea='',@companyAddress='',@intPageNo=1,@intPageSize=10")
    return reslist  #這里,返回的也是查詢結果集,就像一張臨時表,處理方法和上邊一樣。

---前提,你的賬號要有執行存儲過程的權限,否則會報下邊錯誤:

OperationalError: (229, "The EXECUTE permission was denied on the object 'SearchBshi', database 'Wutong', schema 'dbo'.DB-Lib error message 229, severity 14:\nGeneral SQL Server error: Check messages from the SQL Server\n")

 

 

@注意事項:

1, 使用pymssql進行中文操作時候可能會出現中文亂碼我解決的方案是:
        • 文件頭加上 #coding=utf8
        • sql語句中有中文的時候進行encode
             insertSql  =  "insert into WeiBo([UserId],[WeiBoContent],[PublishDate]) values(1,'測試','2012/2/1')".encode( "utf8")
        •  連接的時候加入charset設置信息
              pymssql.connect(host = self.host,user = self.user,password = self.pwd,database = self.db,charset = "utf8")

2,print str(huiyuancontent),不要加str,會報編碼錯誤。用unicode(huiyuancontent)。

3,注意Sql語句,查詢返回的結果值處理問題。reslist=ms.ExecQuery("select top 10 id,c_value from dbo.bx_categories AS bc")

這里reslist是一個數組對象[(u'\u505a\u4e8b',), (u'\u4f5c\u4e3a\u5b9e\u73b0',), (u'\u4f50\u7167\u9f99',)],[]代表查詢的結果集數組,里邊的圓括號表示的是一行一行的數據,圓括號內逗號隔開的是一列一列的數據。

---最主要,是我們取值的時候,要取對應的值。假如我取結果集中第一行第一列的值,那就是reslist[0][0]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM