pymysql的上下文管理器:简化数据库操作

发布于:2024-08-15 ⋅ 阅读:(132) ⋅ 点赞:(0)

pymysql的上下文管理器:简化数据库操作

当我们使用 pymysql 操作数据库时,管理数据库连接和游标的生命周期是一项重要的任务。Python 的上下文管理器提供了一种优雅的方式来处理资源的获取和释放。在本文中,我们将探索如何创建一个简单的 pymysql 上下文管理器,以简化数据库操作。

为什么使用上下文管理器

  • 自动资源管理:自动关闭数据库连接和游标,即使发生异常也能确保资源被释放。
  • 代码可读性:使代码更加简洁,易于理解和维护。
  • 异常处理:可以在退出代码块时统一处理异常。

代码实现

import pymysql

class Connect(object):
    def __init__(self, host, user, password, db, charset='utf8mb4',cursor_class=pymysql.cursors.DictCursor):
        self.config = {
            'host': host,
            'user': user,
            'password': password,
            'database': db,
            'charset': charset,
            'cursorclass': cursor_class
        }
        self.conn = pymysql.connect(self.config)
        self.cursor = self.conn.cursor(pymysql.cursors.DictCursor)

    def __enter__(self):
        # 返回自身以便在 with 块中使用
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        # 检查游标和连接是否打开,然后关闭它们
        if self.cursor:
            self.cursor.close()
        if self.conn:
            self.conn.close()
        # 处理异常
        if exc_type:
            print(f"An error occurred: {exc_val}")

    def exec_query(self, sql, **kwargs):
        # 执行查询并返回结果集
        self.cursor.execute(sql, kwargs)
        return self.cursor.fetchall()

    def exec_command(self, sql, **kwargs):
        # 执行非查询命令并返回影响的行数
        self.cursor.execute(sql, kwargs)
        return self.conn.commit()  # commit() 返回 None,你可能想要返回影响的行数

简单使用

if __name__ == "__main__":
    settings = {
        'host': 'localhost',
        'user': 'your_username',
        'password': 'your_password',
        'database': 'your_database',
        'charset': 'utf8mb4',
    }

    with Connect(**settings) as db:
        results = db.exec_query("SELECT * FROM your_table")
        for result in results:
            print(result)

        affected_rows = db.exec_command("INSERT INTO your_table (column) VALUES (value)")
        print(f"受影响的行数: {affected_rows}")

若有错误与不足请指出,关注DPT一起进步吧!!!


网站公告

今日签到

点亮在社区的每一天
去签到