Python封装mysql数据库

 写一个MySQL的操作类,避免每次重复编写代码,开箱即用,如果老铁觉得有用,可以点个关注哦



import pymysql
# 建立一个简单的数据库操作类
class SimpleMySqlClass:
    # 函数要对数据库进行连接,并建立一个游标为操作数据库做准备
    def __init__(self, host, db_name, user, password):
        self.host = host
        self.db_name = db_name
        self.user = user
        self.password = password
        # self.port = port
        # 调用函数create_connection()对数据库进行连接
        self.connection = self.create_connection()
        # 调用函数create_cursor()生成一个游标,为操作数据库做好准备
        self.cursor = self.create_curour()
    # 建立一个数据库连接
    def create_connection(self):
        # pymysql在1.0以后的版本需要这样写
        self.connection = pymysql.connect(host=self.host, database=self.db_name,user=self.user, password=self.password)
        return self.connection
    # 建立一个游标
    def create_curour(self):
        # 通过数据库连接建立一个操作游标
        self.cursor =self.connection.cursor()
        return self.cursor
    # 执行查询
    def query_sql(self,sql):
        try:
            # 执行查询语句
            self.cursor.execute(sql)
            # 利用游标的fetchall()函数取得查询到的所有记录
            data = self.cursor.fetchall()
            # 返回记录
            return data
        except Exception:
            # 发生错误时返回有错误的SQL语句
            raise Exception('执行的SQL语句: '+sql+',出现异常,请检查')
    # 执行增、删、改相关SQL语句
    def execute(self,sql):
        try:
            # 执行增、删、改SQL语句时,返回的值是操作结果影响的记录数
            re = self.cursor.execute(sql)
            # 提交执行事务
            self.connection.commit()
            return re
        except Exception:
            # 发生错误回滚事务
            self.connection.rollback()
            # 返回-1提示执行出错
            return -1
    #     # 列出数据库中的表
    def list_tables(self):
        sql_1 = "show tables"
        try:
            self.cursor.execute(sql_1)
            table_list = self.cursor.fetchall()
            return table_list
        except Exception:
            raise Exception('执行的SQL语句:'+ sql_1 +',出现异常,请检查!')
    # 关闭连接,执行完相关的数据库操作,及时关闭连接是良好的编程习惯
    def close(self):
        self.connection.close()


# 主函数main对类进行测试
if __name__ == "__main__":
    # 对类实例化
    host = '192.168.1.32'
    mysql_obj = SimpleMySqlClass(host, 'test_db', 'root', '123')
    # 有一个数据库名字是test_db,该数据库下有一张表user_info
    # 调用类中的函数query_sql执行查询语句
    re = mysql_obj.query_sql('select * from user_info')
    # print(re) # 打印结果:(('xiaoxiao', 1), ('xiaoA', 2), ('xiaoB', 3), ('xiaoC', 4), ('xiaoD', 5))
    """
    row的打印结果:
    ('anle', 1)
    ('xiaoA', 2)
    ('xiaoB', 3)
    ('xiaoC', 4)
    ('xiaoD', 5)
    """
    for row in re:
        print("序号:",row[1],"姓名:",row[0])

    # 执行增删改的SQL语句
    add_count = mysql_obj.execute('insert into user_info values("xiaoE",6)')
    if add_count:
        print('添加成功')
    else:
        print("添加失败")

    del_count = mysql_obj.execute('delete from user_info where name = "xiaoE"')
    if del_count:
        print("删除成功")
    else:
        print("删除失败")

    # 列举数据库中的表:
    table_names = mysql_obj.list_tables()  # 打印table_names是一个元组,(('user',), ('user_info',))
    # print(table_names)
    for table in table_names:
        print(table[0])
    # 关闭数据库连接,节省计算机资源
    mysql_obj.close()

### Python 封装 MySQL 数据库的最佳实践 #### 1. 封装数据库连接函数 `db_connect` 为了简化每次建立数据库连接的过程,可以创建一个专门用于获取数据库连接对象的函数。这不仅提高了代码的可读性和维护性,还减少了重复代码。 ```python import mysql.connector from mysql.connector import Error def db_connect(): try: connection = mysql.connector.connect( host='localhost', database='test_db', user='root', password='password' ) if connection.is_connected(): return connection except Error as e: print(f"Error while connecting to MySQL {e}") return None ``` 此部分展示了如何定义一个简单的数据库连接方法[^1]。 #### 2. 创建通用执行SQL语句的方法 `execute_query` 通过构建一个能够处理不同型的 SQL 查询(如 SELECT, INSERT, UPDATE 和 DELETE)的基础函数来增强灵活性。该函数接收两个参数:一个是打开的数据库连接实例;另一个是要被执行的具体命令字符串。 ```python def execute_query(connection, query, params=None): cursor = connection.cursor() try: cursor.execute(query, params) connection.commit() # 对于非查询操作需要提交事务 print("Query executed successfully") except Error as error: print(f"Failed executing query: {error}") finally: cursor.close() ``` 上述代码片段说明了怎样编写一个适用于多种场景下的 SQL 执行器[^2]。 #### 3. 构建特定业务逻辑的操作接口 基于前面提到的基础组件之上,可以根据实际需求设计更高级别的 API 接口。比如下面的例子实现了向指定表插入新记录的功能: ```python def add_record_to_table(table_name, record_data): conn = db_connect() insert_sql = f""" INSERT INTO `{table_name}` ({','.join(record_data.keys())}) VALUES ({','.join(['%s'] * len(record_data))}); """ execute_query(conn, insert_sql, tuple(record_data.values())) conn.close() ``` 这段程序解释了利用之前定义好的工具快速搭建面向具体应用的服务层API的方式。 #### 4. 实现安全的数据检索功能 `fetch_records` 考虑到安全性以及效率问题,在从数据库中提取信息时应该采取预防措施防止潜在的安全风险并优化性能表现。这里提供了一个带有分页支持的结果集取回机制作为示范: ```python def fetch_records(table_name, page=1, per_page=10): offset = (page - 1) * per_page select_sql = f""" SELECT * FROM `{table_name}` LIMIT %s OFFSET %s; """ conn = db_connect() cursor = conn.cursor(dictionary=True) try: cursor.execute(select_sql, (per_page, offset)) rows = cursor.fetchall() return rows except Exception as ex: raise ex finally: cursor.close() conn.close() ``` 以上示例介绍了关于高效且安全地获取多条记录的技术方案。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农者也

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值