关于Python中的上下文管理器可以参考:
https://www.cnblogs.com/huchong/p/8268765.html#undefined
https://www.cnblogs.com/DragonFire/p/6764066.html
下面说明如何利用Python中的上下文管理器执行MySQL查询:
示例1:
# 导入pymysql包,用于连接数据库
import pymysql
sqlx = 'select goods_id,goods_name from goods where goods_id<10'
def get_conn(**kwargs):
return pymysql.connect(host=kwargs.get('host','localhost'), #'host'是键,'localhost'是默认值
user=kwargs.get('user'),
passwd=kwargs.get('passwd'),
database=kwargs.get('database'),
port=kwargs.get('port',3306), #'port'是键,3306是默认值
charset=kwargs.get('charset','utf8'))
# 创建数据库连接对象
conn = get_conn(user='root',passwd='883721',database='test',charset='utf8')
with conn.cursor() as cur:
cur.execute(sqlx)
print(cur.fetchone())
# 上述代码的查询结果为:
(4, 'HTCN85原装充电器 ')
上述代码中with语句里的游标cur就是一个上下文管理器对象,with语句结束时,游标cur会被自动关闭,避免了对数据库中的表进行查询操作后要手动关闭游标的麻烦。但是这种写法只是在with语句结束时自动关闭了游标,数据库连接并没有同时自动断开。假如想要实现在with语句结束时,游标自动关闭,数据库连接也自动断开,我们可以通过自定义上下文管理器对象达到这个目的。如下示例所示:
示例2:
import pymysql
class DataBase(object):
def __init__(self,name,password):
# 创建数据库连接
self.conn = pymysql.connect('localhost','root',str(password),str(name),charset='utf8')
# 创建cursor对象
self.cursor = self.conn.cursor()
def __enter__(self):
return self.cursor # 返回cursor对象,且这个cursor对象会被赋给with语句中as后面的变量
def __exit__(self,exc_type,exc_value,traceback):
self.cursor.close() # 关闭游标对象
self.conn.close() # 断开数据库连接
def main():
with DataBase('test',883721) as db:
db.execute('select * from employee') # 执行sql语句
content = db.fetchall() # 获取数据(db中保存着查询结果集)
for info in content:
print(info)
if __name__ == '__main__':
main()
其他参考:
PS:本文为博主原创文章,转载请注明出处。