我有一个脚本,可以从数据库发出各种读取请求(我有许多类似于read()
方法的方法(。我想避免重复创建和关闭光标的代码。所以我正在携手使用上下文管理器和生成器。(在下面的代码中,db_connection
是一个 mysql 连接器对象。
from contextlib import contextmanager
class DatabaseReader():
def __init__(self, db_connection):
self.db_connection = db_connection
self.num = num
@contextmanager
def connect(self):
cursor = self.db_connection.cursor(buffered=True)
try:
yield
finally:
cursor.close()
def read(self):
with self.connect():
cursor.execute("SELECT * FROM table;")
但是,调用"read"方法给了我一个AttributeError
,因为没有定义cursor
。如何将游标对象"传递"到 yield 语句?
在自定义实现中,您需要"生成"一个cursor
对象,该对象将绑定在 with
语句的 as
子句中:
代码中需要 3 个修复:
- 传递要分配给
self.num = num
的num
- 屈服
cursor
- 将
as
关键字添加到语句with
from contextlib import contextmanager
class DatabaseReader():
def __init__(self, db_connection, num):
self.db_connection = db_connection
self.num = num
@contextmanager
def connect(self):
cursor = self.db_connection.cursor(buffered=True)
try:
yield cursor
finally:
cursor.close()
def read(self):
with self.connect() as cur:
cur.execute("SELECT * FROM table;")