Python3操作MySQL基於PyMySQL封裝的類


Python3操作MySQL基於PyMySQL封裝的類

  在未使用操作數據庫的框架開發項目的時候,我們需要自己處理數據庫連接問題,今天在做一個Python的演示項目,寫一個操作MySQL數據庫的類,基於PyMySQL庫在Python3上實現。在寫業務邏輯代碼的時候,可以方便很多,時間關系,沒有寫太完善,只寫了常用的操作。

  直接上代碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'Python連接到 MySQL 數據庫及相關操作(基於Python3)'

import pymysql.cursors


class Database:
    """ Python連接到 MySQL 數據庫及相關操作 """
    """
    conf: 類參數,數據庫的連接參數配置字典,含host、port、user、pw、db、charset(可選,默認utf8)
    connected: 屬性,True數據庫連接成功,False連接失敗

    insert(self, table, val_obj): 方法,插入數據到數據表
        table: 數據表名稱
        val_obj: 待插入數據的字段名和值的鍵值對字典
        返回: 成功則返回新插入數據的主鍵ID,失敗返回False

    update(self, table, val_obj, range_str): 方法,更新數據表中的數據
        table: 數據表名稱
        val_obj: 待更新數據的字段名和值的鍵值對字典
        range_str: 更新范圍的條件語句字符串
        返回: 成功返回更新的行數,失敗返回False

    delete(self, table, range_str): 方法,在數據表中刪除數據
        table: 數據表名稱
        range_str: 刪除范圍的條件語句字符串
        返回: 成功返回刪除的行數,失敗返回False

    select_one(self, table, factor_str, field='*'): 方法,查詢表中符合條件唯一的一條數據
        table: 數據表名稱
        factor_str: 查詢唯一條件語句字符串
        field: 查詢結果返回哪些字段,多個用逗號分隔,可選參數,默認返回所有字段
        返回: 成功返回一條數據的字段名與值的一維字典,失敗返回False

    select_more(self, table, range_str, field='*'): 方法,查詢表中符合條件的所有數據
        table: 數據表名稱
        range_str: 查詢條件語句字符串
        field: 查詢結果返回哪些字段,多個用逗號分隔,可選參數,默認返回所有字段
        返回: 成功返回多條數據的字段名與值的二維字典,失敗返回False

    count(self, table, range_str='1'): 方法,統計數據表中符合條件的總函數
        table: 數據表名稱
        range_str: 查詢條件語句字符串,可選參數,默認表中所有行數
        返回: 成功返回符合條件的行數,失敗返回False

    sum(self, table, field, range_str='1'): 方法,對數據表中某數值類型字段求和
        table: 數據表名稱
        field: 需要求和的字段,可以是多個字段的計算公式
        range_str: 需要求和的條件語句字符串,可選參數,默認表中所有行
        返回: 成功返回求和結果,失敗返回False

    close(self): 方法,關閉數據庫連接,對象銷毀時也會自動關閉,所以多數時候不用特意調用
    """
    connected = False
    __conn = None

    # 構造函數,初始化時直接連接數據庫
    def __init__(self, conf):
        if type(conf) is not dict:
            print('錯誤: 參數不是字典類型!')
        else:
            for key in ['host', 'port', 'user', 'pw', 'db']:
                if key not in conf.keys():
                    print('錯誤: 參數字典缺少 %s' % key)
            if 'charset' not in conf.keys():
                conf['charset'] = 'utf8'
        try:
            self.__conn = pymysql.connect(
                host=conf['host'],
                port=conf['port'],
                user=conf['user'],
                passwd=conf['pw'],
                db=conf['db'],
                charset=conf['charset'],
                cursorclass=pymysql.cursors.DictCursor)
            self.connected = True
        except pymysql.Error as e:
            print('數據庫連接失敗:', end='')

    # 插入數據到數據表
    def insert(self, table, val_obj):
        sql_top = 'INSERT INTO ' + table + ' ('
        sql_tail = ') VALUES ('
        try:
            for key, val in val_obj.items():
                sql_top += key + ','
                sql_tail += val + ','
            sql = sql_top[:-1] + sql_tail[:-1] + ')'
            with self.__conn.cursor() as cursor:
                cursor.execute(sql)
            self.__conn.commit()
            return self.__conn.insert_id()
        except pymysql.Error as e:
            self.__conn.rollback()
            return False

    # 更新數據到數據表
    def update(self, table, val_obj, range_str):
        sql = 'UPDATE ' + table + ' SET '
        try:
            for key, val in val_obj.items():
                sql += key + '=' + val + ','
            sql = sql[:-1] + ' WHERE ' + range_str
            with self.__conn.cursor() as cursor:
                cursor.execute(sql)
            self.__conn.commit()
            return cursor.rowcount
        except pymysql.Error as e:
            self.__conn.rollback()
            return False

    # 刪除數據在數據表中
    def delete(self, table, range_str):
        sql = 'DELETE FROM ' + table + ' WHERE ' + range_str
        try:
            with self.__conn.cursor() as cursor:
                cursor.execute(sql)
            self.__conn.commit()
            return cursor.rowcount
        except pymysql.Error as e:
            self.__conn.rollback()
            return False

    # 查詢唯一數據在數據表中
    def select_one(self, table, factor_str, field='*'):
        sql = 'SELECT ' + field + ' FROM ' + table + ' WHERE ' + factor_str
        try:
            with self.__conn.cursor() as cursor:
                cursor.execute(sql)
            self.__conn.commit()
            return cursor.fetchall()[0]
        except pymysql.Error as e:
            return False

    # 查詢多條數據在數據表中
    def select_more(self, table, range_str, field='*'):
        sql = 'SELECT ' + field + ' FROM ' + table + ' WHERE ' + range_str
        try:
            with self.__conn.cursor() as cursor:
                cursor.execute(sql)
            self.__conn.commit()
            return cursor.fetchall()
        except pymysql.Error as e:
            return False

    # 統計某表某條件下的總行數
    def count(self, table, range_str='1'):
        sql = 'SELECT count(*)res FROM ' + table + ' WHERE ' + range_str
        try:
            with self.__conn.cursor() as cursor:
                cursor.execute(sql)
            self.__conn.commit()
            return cursor.fetchall()[0]['res']
        except pymysql.Error as e:
            return False

    # 統計某字段(或字段計算公式)的合計值
    def sum(self, table, field, range_str='1'):
        sql = 'SELECT SUM(' + field + ') AS res FROM ' + table + ' WHERE ' + range_str
        try:
            with self.__conn.cursor() as cursor:
                cursor.execute(sql)
            self.__conn.commit()
            return cursor.fetchall()[0]['res']
        except pymysql.Error as e:
            return False

    # 銷毀對象時關閉數據庫連接
    def __del__(self):
        try:
            self.__conn.close()
        except pymysql.Error as e:
            pass

    # 關閉數據庫連接
    def close(self):
        self.__del__()


免責聲明!

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



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