1. 程式人生 > >對PyMySql簡單的二次封裝

對PyMySql簡單的二次封裝

本人新手,剛開始上手類,程式碼不規範的地方,大家可以直接評論在下面  。

本次是基於PyMySql的的二次封裝, 所以執行此程式碼之前  首先安裝PyMySQL

在cmd中執行“pip  install  PyMySql”  安裝即可,先來一個實際執行截圖

 

好了獻上原始碼一份

# author: xiejiangpeng
# time:2018/10/28/11:03
# version:python3.6
# message:對mysql進行簡單的二次封裝,主要有,建表,插入語句登

import pymysql

"""
說明:
1.maketable()  格式 : tablename(表名),**field(key='欄位名',value='欄位說明')  預設的欄位型別為varchar(255)
2.insertsqlone()  格式 : tablename,**field(key='欄位名',value='欄位值')  **field長度不限
3.querysql()  格式 : querysql(查詢sql)
4.update() 格式 : updatesql(更新sql)
5.deleteone() 格式 : tablename,**field(查詢條件 比如 id=1)
"""


class DiyMysql(object):

    def __init__(self, host, port, user, passwd, db, charset):
        self.host = host
        self.port = port
        self.user = user
        self.passwd = passwd
        self.db = db
        self.charset = charset
        try:
            self.condb = pymysql.connect(host=self.host, port=self.port, user=self.user,
                                         passwd=self.passwd, db=self.db, charset=self.charset)
        except Exception as abnormal:
            print("資料庫連線錯誤,錯誤內容%s " % abnormal)
        # 建立一個遊標物件
        self.cursor = self.condb.cursor()

    def maketable(self, tablename, **field):

        basesql = ""  # 定義basesql
        # 判斷表名為tablename表名是否存在,如果是 直接刪除
        self.cursor.execute("DROP TABLE IF EXISTS %s" % tablename)

        # 將field,拼接basesql
        for key in field:
            basesql = basesql + "%s varchar(255) DEFAULT NULL COMMENT '%s'," % (key, field.get(key))

        makesql = """
        CREATE TABLE %s (
  id int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
  %s
  PRIMARY KEY (`id`)
)
        """ % (tablename, basesql)
        # 執行建表SQL
        self.cursor.execute(makesql)
        print("表:'%s' 建立成功" % tablename)

    def insertsqlone(self, tablename, **field):

        i = 0
        liststr = ""  # 欄位的集合
        listvalues = []  # values欄位對應值的集合
        for key in field:
            liststr = liststr + "%s," % key
            listvalues.append(field[key])
            i = i + 1
        listfield = "(" + liststr[0:len(liststr) - 1] + ")"  # 最終的欄位集合
        values = tuple(listvalues)  # 最終的欄位值集合

        # sql語句
        insertsql = "INSERT INTO %s%s VALUES %s" % (tablename, listfield, values)
        try:
            self.cursor.execute(insertsql)  # 執行SQL
            self.condb.commit()  # 提交到資料庫執行
        except Exception as abnormal:
            self.condb.rollback()  # 發生錯誤的時候 回滾
            print("執行失敗 insert語句:'%s',失敗資訊為 %s" % (insertsql, abnormal))
        # 判斷是否執行成功
        if self.cursor.rowcount == 1:
            print("執行成功 insert語句:'%s'" % insertsql)

    def querysql(self, sqlquery):
        try:
            self.cursor.execute(sqlquery)  # 影響的行數
        except Exception as abnormal:
            print("SQL有誤,錯誤內容 %s" % abnormal)
        if self.cursor.rowcount == 0:  # 0 則代表沒有查詢結果
            return "沒有查詢的結果.."
        elif self.cursor.rowcount == 1:  # 影響行數 為1 fetchone
            return list(self.cursor.fetchone())
        else:  # 多行情況下 使用fetchall
            return list(self.cursor.fetchall())

    def update(self, updatesql):
        try:
            self.cursor.execute(updatesql)
            self.condb.commit()
        except Exception as abnormal:
            self.condb.rollback()
            print("執行失敗!update語句:'%s', 失敗內容為 %s" % (updatesql, abnormal))
            exit()
        # 判斷是否更新成功
        if self.cursor.rowcount == 1:
            print("執行成功!update語句:'%s'" % updatesql)
        else:
            print("執行成功!update語句:'%s',warning:更新後的值與跟新之前的值相等,或者查詢不到對應的結果" % updatesql)

    def deleteone(self, deletesql):
        try:
            self.cursor.execute(deletesql)
            self.condb.commit()
        except Exception as abnormal:
            self.condb.rollback()
            print("執行失敗!delete語句:'%s', 失敗內容為 %s" % (deletesql, abnormal))
            exit()
        # 判斷是否更新成功
        if self.cursor.rowcount == 1:
            print("執行成功!delete語句:'%s'" % deletesql)

    # 解構函式
    def __del__(self):
        self.cursor.close()
        self.condb.close()


if __name__ == '__main__':
    # 例項化
    diycon = DiyMysql(host="127.0.0.1", port=3306, user="root",
                      passwd="xxx", db="dbname", charset="utf8")

    # 1.新建一個名稱為的表,欄位為name,age,address,其中的value為欄位說明
    diycon.maketable(tablename="tb_xiejiangpeng", name="姓名", age="年齡", address="家庭住址")

    # 2.在tb_xiejiangpeng表中 插入一條資料
    diycon.insertsqlone(tablename="tb_xiejiangpeng", name="謝江鵬", age="22", address="湖南長沙")

    # 3.根據name=謝江鵬 查詢剛才插入的資料
    queryresult = diycon.querysql("select * from tb_xiejiangpeng where name='謝江鵬'")
    print("查詢到的結果為:", queryresult)

    # 4.將id=1的那條資料 名稱修改成"彭敏"
    diycon.update("update tb_xiejiangpeng set name='彭敏' where id ='1'")

    # 5.刪除name='彭敏'的那條資料
    diycon.deleteone("delete from tb_xiejiangpeng where name='彭敏'")