我将 Flask 与 Flask-MySQL 一起使用,并且之前执行了以下操作:
db = mysql.connect()
cursor = db.cursor()
#do database stuff
cursor.close()
db.close()
但我想我会让事情变得更简洁、更地道,所以我尝试了:
with mysql.connect() as db, db.cursor() as cursor:
#do database stuff
它给我以下错误“AttributeError:‘Cursor’对象没有属性‘cursor’”
经过一些调查,当我自己执行 mysql.connect() 时,它返回一个连接对象,但是当我在 with 语句中执行它时...它返回一个游标对象!所以这有效:
with mysql.connect() as cursor:
#do database stuff
那么这里发生了什么?为什么在 with 语句中返回类型会改变?我查看了 Flask-MySQL 的源代码,但找不到任何东西......
此外,在 with block 的末尾关闭数据库连接是否仍能正常工作?
相关版本信息:
- Python == 2.7.3
- flask == 0.10.1
- Flask-MySQL == 1.3
最佳答案
表达式:
with X as Y:
....
并不意味着 Y
"is"X
。相反,调用 X.__enter__()
并将其结果绑定(bind)到 Y
作为 with
语句的主体。
在with
体的末尾,或者发生异常时,调用X.__exit__(...)
来处理成功或失败。
在这种情况下,mysql.connect()
的结果是一个连接,它公开了一个执行以下操作的上下文管理器:
__enter__
创建游标并开始事务;__exit__
根据需要提交或回滚事务。
关于python - mysql.connect() 在 with 语句中使用时返回不同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35024684/