2016-01-26 83 views
0

我使用烧瓶瓶,MySQL和先前执行以下操作使用时,不同的类型:mysql.connect()返回声明

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的:‘光标’对象有没有属性‘光标’”

一个小调查后,当我做mysql.connec t()在它自己它正在返回一个连接对象,但当我在一个with语句中执行它...它返回一个游标对象!所以这个工程:

with mysql.connect() as cursor: 
    #do database stuff 

所以这是怎么回事呢?为什么在with语句中返回类型会改变?我查看了Flask-MySQL的源代码,但找不到任何东西...

此外,这仍然会正常工作,以关闭db连接在块结束?

相关版本信息:

  • 的Python == 2.7.3
  • 烧瓶== 0.10.1
  • 烧瓶的MySQL == 1.3

回答

2

表达:

with X as Y: 
    .... 

并不意味着Y“is”X。相反,X.__enter__()被调用,然后对with语句的主体绑定到Y

with正文的末尾,或者在发生异常时,调用X.__exit__(...)来处理成功或失败。

在这种情况下,mysql.connect()的结果,这是一个连接,暴露的上下文管理器,它执行以下操作:

  • __enter__创建一个光标和开始一个事务;
  • __exit__要么酌情提交或回滚事务。
+0

但是,当我在https://github.com/cyberdelia/flask-mysql/blob/master/flaskext/mysql.py检查瓶MySQL的源代码中有no__enter__OR__exit__function班上,只有an__init__功能。 – jcmiller11

+1

@jcmiller正如我所说的,它是'mysql.connect()'的**结果**,它暴露了上下文管理器API。在这种情况下,结果是'MySQLdb.connect'的返回值(请参阅您链接的代码),它是一个'MySQLdb.Connection' ...这是暴露api的类。 – donkopotamus

+0

好的,谢谢@ donkopotamus,帮助我把头围绕在它周围。 – jcmiller11