with语句可以实现任何try/finally语句实现的功能,而且代码更加清晰简洁。因此,我们也可以对数据库的操作进行封装,封装完成以后,可以使用with语句保证数据库连接无论在什么情况下都会关闭。
为了在with语句中管理数据库连接,我们需要实现上下文管理器。有两种方法实现上下文管理器,我们选择比较简单的contextmanager。使用contextmanager装饰器需要从标准库的contextlib模块中进行导入。实现上下文管理器以后,创建连接的函数如下:
from contextlib import contextmanager
@contextmanager
def get_conn(**kwargs):
conn = db.connect(host=kwargs.get('host', 'localhost'),
user=kwargs.get('user'),
passwd=kwargs.get('passwd'),
port=kwargs.get('port', 3306),
db=kwargs.get('db'))
try:
yield conn
finally:
if conn:
conn.close()
对创建数据库连接的函数进行封装以后,可以使用with语句管理数据库连接,使得代码更加清晰,且不容易出错。如下所示:
conn_args = dict(host='127.0.0.1', ......)
with get_conn(**conn_args) as conn:
with conn as cur:
cur.execute("select * from student")
......
来源:《Python Linux系统管理与自动化运维》