我习惯(宠坏了?)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... 关闭文件 我们会进行这样的操作:打开文件,读写,关闭文件。程序员经常会忘记关闭文件。上下文管理器可以在不需要文件的时候,自动关闭文件。 下面我们看一下两段程序: #