1
leojoy710 2013-06-09 09:37:06 +08:00 1
首先...lazy一般是parent被查询的时候...不把child查出来...而是parent.child被访问或者被iter的时候才查询child...
这里select就是用一个select取child... joint和subquery是在parent被查询的时候child就被用join或者subquery查出来了... dynamic是parent.child是一个sqlalchemy的Query对象...可以用它的那些个过滤方法过滤后再查询... 写的好乱... |
2
TempAccount 2013-06-09 09:43:32 +08:00 1
首先楼主需要去过一遍sqlalchemy文档, 不然看穿衣服的小姑娘(flask-sqlalchemy)看出花就不明白衣服(sqlalchemy)怎么穿, flask-sqlalchemy只是flask流程下sqlalchemy的封装和helper(分页), 他的例子仅仅是让用户了解一下和纯sqlalchemy的异同, 本身假设使用者掌握一定程度sqlalchemy了
|
3
ivanlw OP |
4
ivanlw OP @TempAccount 嗯,明白了,这就去翻……
|
5
leojoy710 2013-06-09 09:55:22 +08:00 1
lazy一般的意思是lazyload...就是在读取person的时候不读取address...
但是sqlalchemy是使用改lazy参数的方法来设置是否lazyload的...所以这就让lazy这个参数有点奇怪了... select就是在访问或者iterate person.addresses的时候用一个select语句把address查询出来... joint和subquery首先理解是不用lazyload...就是在查询person的时候address用join或者subquery语句查询出来... dynamic就是上面说的...应该挺好理解?....... 实在不行还是多用用...了解一些sql的东西...看toturial... |
6
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 |