pymysql的上下文管理器:简化数据库操作
pymysql的上下文管理器:简化数据库操作
当我们使用 pymysql
操作数据库时,管理数据库连接和游标的生命周期是一项重要的任务。Python 的上下文管理器提供了一种优雅的方式来处理资源的获取和释放。在本文中,我们将探索如何创建一个简单的 pymysql
上下文管理器,以简化数据库操作。
为什么使用上下文管理器
- 自动资源管理:自动关闭数据库连接和游标,即使发生异常也能确保资源被释放。
- 代码可读性:使代码更加简洁,易于理解和维护。
- 异常处理:可以在退出代码块时统一处理异常。
代码实现
import pymysqlclass 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 selfdef __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一起进步吧!!!