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一起进步吧!!!