利用Python上下文管理器执行MySQL查询

关于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()

其他参考:

https://mp.weixin.qq.com/s?__biz=MjM5MTYwMjI3Mw==&mid=2652092269&idx=1&sn=ef2ef4251ed7a34abad87a26c9a217ff&chksm=bd5414638a239d75eaf02f1b41cbd7aa4ebec95a1080e5953a19d20ac8d79b8dfc245ae10b57&scene=21#wechat_redirect

PS:本文为博主原创文章,转载请注明出处。

猜你喜欢

转载自blog.csdn.net/qq_41080850/article/details/85100641