读Flask-SQLAlchemy的一点不理解的地方,请指点下~

2013-06-09 09:22:58 +08:00
 ivanlw
http://pythonhosted.org/Flask-SQLAlchemy/models.html#one-to-many-relationships
relational有一个lazy的属性没看懂它说的是什么意思,举的几个例子说可能是select, joint, subquery和dynamic,就更让我迷惑了……
然后下面的backref也有可以设置lazy的参数,就更加更加迷惑了……
3298 次点击
所在节点    Python
6 条回复
leojoy710
2013-06-09 09:37:06 +08:00
首先...lazy一般是parent被查询的时候...不把child查出来...而是parent.child被访问或者被iter的时候才查询child...
这里select就是用一个select取child...
joint和subquery是在parent被查询的时候child就被用join或者subquery查出来了...
dynamic是parent.child是一个sqlalchemy的Query对象...可以用它的那些个过滤方法过滤后再查询...


写的好乱...
TempAccount
2013-06-09 09:43:32 +08:00
首先楼主需要去过一遍sqlalchemy文档, 不然看穿衣服的小姑娘(flask-sqlalchemy)看出花就不明白衣服(sqlalchemy)怎么穿, flask-sqlalchemy只是flask流程下sqlalchemy的封装和helper(分页), 他的例子仅仅是让用户了解一下和纯sqlalchemy的异同, 本身假设使用者掌握一定程度sqlalchemy了
ivanlw
2013-06-09 09:44:12 +08:00
@leojoy710 首先,感谢帮助;
你说的“lazy一般”,是说不设置lazy参数的时候吗?
……后面三句话好像有点抽象,能不能用它的Person和Address的例子简单说明下呢?再次谢谢了!
ivanlw
2013-06-09 09:44:52 +08:00
@TempAccount 嗯,明白了,这就去翻……
leojoy710
2013-06-09 09:55:22 +08:00
lazy一般的意思是lazyload...就是在读取person的时候不读取address...
但是sqlalchemy是使用改lazy参数的方法来设置是否lazyload的...所以这就让lazy这个参数有点奇怪了...
select就是在访问或者iterate person.addresses的时候用一个select语句把address查询出来...
joint和subquery首先理解是不用lazyload...就是在查询person的时候address用join或者subquery语句查询出来...
dynamic就是上面说的...应该挺好理解?.......

实在不行还是多用用...了解一些sql的东西...看toturial...
JhOOOn
2015-09-20 08:24:13 +08:00
可能楼主已经对 flask 非常了解了,但看到一篇解释的很好,转过来给其他人看吧:

这里说一下对 db.relationship lazy 的理解,看如下代码

class Role (db.Model ):
__tablename__ = 'roles'
id = db.Column (db.Integer, primary_key=True )
name = db.Column (db.String (64 ), unique=True )
users = db.relationship ('User', backref='role', lazy='dynamic')


class User (db.Model ):
__tablename__ = 'users'
id = db.Column (db.Integer, primary_key=True )
username = db.Column (db.String (64 ), unique=True, index=True )
role_id = db.Column (db.Integer, db.ForeignKey ('roles.id'))


假设 role 是已经获取的一个 Role 的实例
lazy:dynamic => role.users 不会返回 User 的列表, 返回的是 sqlalchemy.orm.dynamic.AppenderBaseQuery 对象
当执行 role.users.all ()是才会真正执行 sql ,这样的好处就是可以继续过滤

lazy:select => role.users 直接返回 User 实例的列表,也就是直接执行 sql

注意: db.session.commit 只有在对象有变化时才会真的执行 update

转自: http://www.bkjia.com/ASPjc/893049.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/71768

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX