当前位置: 首页 > 面试题库 >

Python的MySQLdb的上下文管理器

曾丰茂
2023-03-14
问题内容

我习惯(宠坏了?)python的SQLite接口来处理SQL数据库。python的SQLite
API中的一个不错的功能是“上下文管理器”,即python的with语句。我通常以以下方式执行查询:

import as sqlite

with sqlite.connect(db_filename) as conn:
    query = "INSERT OR IGNORE INTO shapes VALUES (?,?);"
    results = conn.execute(query, ("ID1","triangle"))

使用上面的代码,如果我的查询修改了数据库并且忘记了运行conn.commit(),则上下文管理器在退出with语句后自动为我运行它。它还可以很好地处理异常:如果在我提交任何内容之前发生异常,则数据库将回滚。

我现在正在使用该MySQLdb接口,该接口似乎不支持开箱即用的类似上下文管理器。我如何创建自己的?还有一个相关的问题在这里,但它并没有提供一个完整的解决方案。


问题答案:

以前,MySQLdb连接是上下文管理器。从2018
年12月4日提交该内容开始,MySQLdb连接不再是上下文管理器,用户必须显式调用conn.commit()或conn.rollback()或编写自己的上下文管理器,例如下面的一个。

您可以使用如下形式:

import config
import MySQLdb
import MySQLdb.cursors as mc
import _mysql_exceptions
import contextlib
DictCursor = mc.DictCursor
SSCursor = mc.SSCursor
SSDictCursor = mc.SSDictCursor
Cursor = mc.Cursor

@contextlib.contextmanager
def connection(cursorclass=Cursor,
               host=config.HOST, user=config.USER,
               passwd=config.PASS, dbname=config.MYDB,
               driver=MySQLdb):
    connection = driver.connect(
            host=host, user=user, passwd=passwd, db=dbname,
            cursorclass=cursorclass)
    try:
        yield connection
    except Exception:
        connection.rollback()
        raise
    else:
        connection.commit()
    finally:
        connection.close()

@contextlib.contextmanager
def cursor(cursorclass=Cursor, host=config.HOST, user=config.USER,
           passwd=config.PASS, dbname=config.MYDB):
    with connection(cursorclass, host, user, passwd, dbname) as conn:
        cursor = conn.cursor()
        try:
            yield cursor
        finally:
            cursor.close()


with cursor(SSDictCursor) as cur:
    print(cur)
    connection = cur.connection
    print(connection)
    sql = 'select * from table'
    cur.execute(sql)
    for row in cur:
        print(row)

要使用它,您可以将其放置config.py在PYTHONPATH中,并在其中定义HOST,USER,PASS和MYDB变量。



 类似资料:
  • 问题内容: 我不明白为什么无法在此示例中模拟NamedTemporaryFile.name: 测试结果在: 问题答案: 您设置的模拟错误:不是上下文管理器,而是 返回 了一个上下文管理器。将您的设置行替换为: 这样您的测试就可以了。

  • 问题内容: 在这个问题中,我定义了一个包含上下文管理器的上下文管理器。完成此嵌套的最简单的正确方法是什么?我最后打电话了。但是,在中,我很确定我必须调用finally块,以防引发异常。如果出现问题,是否应该设置type_,value和traceback参数?我检查了,但找不到任何实用程序来帮助解决此问题。 来自问题的原始代码: 问题答案: 创建上下文管理器的简单方法是使用。像这样: 然后使用。语句

  • 本文向大家介绍Python多个上下文管理器,包括了Python多个上下文管理器的使用技巧和注意事项,需要的朋友参考一下 示例 您可以同时打开多个内容管理器: 它与嵌套上下文管理器具有相同的效果:            

  • 本文向大家介绍Python实现上下文管理器的方法,包括了Python实现上下文管理器的方法的使用技巧和注意事项,需要的朋友参考一下 问题 你想自己去实现一个新的上下文管理器,以便使用with语句。 解决方案 实现一个新的上下文管理器的最简单的方法就是使用 contexlib 模块中的 @contextmanager 装饰器。 下面是一个实现了代码块计时功能的上下文管理器例子: 在函数 timeth

  • 问题内容: 我正在阅读http://eigenhombre.com/2013/04/20/introduction-to-context- managers/ 。 在里面: 上下文管理器是一种在需要的地方准确分配和释放某种资源的方法。最简单的示例是文件访问: 这基本上等于: 本文继续进行更多的解释,但是我仍然不确定我是否简单地理解了它们的目的。有人可以澄清。还有什么是“上下文”? 我已经看过尝试通

  • 上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存)。它的语法形式是with...as... 关闭文件 我们会进行这样的操作:打开文件,读写,关闭文件。程序员经常会忘记关闭文件。上下文管理器可以在不需要文件的时候,自动关闭文件。 下面我们看一下两段程序: #