Python連接操作SQLServer\MySQL示例一(查詢及更新操作、中文亂碼問題)


1、中文亂碼問題:

  (1)、文件頭加上# -*- coding:utf-8 -*-  或者  #coding=utf8

  (2)、pymssql.connect連接串中charset是要跟你數據庫的編碼一樣,如果是數據庫是gb2312 ,則寫charset='gb2312'。

  (3)、讀取數據時需要decode('utf-8'),寫入數據時需要encode('utf-8'),這樣就可以避免中文亂碼或報錯問題。

2、需要安裝pymssql包(連接mysql安裝pymysql)

  pip install pymssql

3、代碼:

# -*- coding:utf-8 -*-

import pymssql

class MSSQL:
    def __init__(self,host,user,pwd,db):
        self.host = host
        self.user = user
        self.pwd = pwd
        self.db = db

    def __GetConnect(self):
        if not self.db:
            raise(NameError,"沒有設置數據庫信息")
        self.conn = pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset="utf8")
        cur = self.conn.cursor()
        if not cur:
            raise(NameError,"連接數據庫失敗")
        else:
            return cur

    def Selsql(self,sql):
        cur = self.__GetConnect()
        cur.execute(sql)
        resList = cur.fetchall()

        #查詢完畢后必須關閉連接
        self.conn.close()
        return resList

    def Exesql(self,sql):
        cur = self.__GetConnect()
        try:
            # 執行sql語句    
            cur.execute(sql)
            # 提交到數據庫
            self.conn.commit()
        except:
            # 發生錯誤時回滾
            conn.rollback()
            # 關閉數據庫連接
            self.conn.close()
ms = MSSQL(host="192.168.1.1",user="sa",pwd="sa",db="testdb")
reslist = ms.Selsql("select * from webuser")
for i in reslist:
    print i

newsql="update webuser set name='%s' where id=1"%u'測試'
print newsql
ms.Exesql(newsql.encode('utf-8'))

 

4、數據庫操作常用函數:

commit() 提交
rollback() 回滾

cursor用來執行命令的方法:
callproc(self, procname, args):用來執行存儲過程,接收的參數為存儲過程名和參數列表,返回值為受影響的行數
execute(self, query, args):執行單條sql語句,接收的參數為sql語句本身和使用的參數列表,返回值為受影響的行數
executemany(self, query, args):執行單挑sql語句,但是重復執行參數列表里的參數,返回值為受影響的行數
nextset(self):移動到下一個結果集

cursor用來接收返回值的方法:
fetchall(self):接收全部的返回結果行.
fetchmany(self, size=None):接收size條返回結果行.如果size的值大於返回的結果行的數量,則會返回cursor.arraysize條數據.
fetchone(self):返回一條結果行.
scroll(self, value, mode='relative'):移動指針到某一行.如果mode='relative',則表示從當前所在行移動value條,如果 mode='absolute',則表示從結果集的第一行移動value條.

更新操作語句中列表的運用:
  value=[1,'aaa']
  cur.execute('insert into test values(%s,%s)',value)

  values=[]
  for i in range(20):
  values.append((i,'aaa'+str(i))) 
  cur.executemany('insert into test values(%s,%s)',values)

 


免責聲明!

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



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