V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ivanlw
V2EX  ›  Python

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

  •  
  •   ivanlw ·
    tolinwei · 2013-06-09 09:22:58 +08:00 · 3414 次点击
    这是一个创建于 4183 天前的主题,其中的信息可能已经有所发展或是发生改变。
    http://pythonhosted.org/Flask-SQLAlchemy/models.html#one-to-many-relationships
    relational有一个lazy的属性没看懂它说的是什么意思,举的几个例子说可能是select, joint, subquery和dynamic,就更让我迷惑了……
    然后下面的backref也有可以设置lazy的参数,就更加更加迷惑了……
    6 条回复    2015-09-20 08:24:13 +08:00
    leojoy710
        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对象...可以用它的那些个过滤方法过滤后再查询...


    写的好乱...
    TempAccount
        2
    TempAccount  
       2013-06-09 09:43:32 +08:00   ❤️ 1
    首先楼主需要去过一遍sqlalchemy文档, 不然看穿衣服的小姑娘(flask-sqlalchemy)看出花就不明白衣服(sqlalchemy)怎么穿, flask-sqlalchemy只是flask流程下sqlalchemy的封装和helper(分页), 他的例子仅仅是让用户了解一下和纯sqlalchemy的异同, 本身假设使用者掌握一定程度sqlalchemy了
    ivanlw
        3
    ivanlw  
    OP
       2013-06-09 09:44:12 +08:00
    @leojoy710 首先,感谢帮助;
    你说的“lazy一般”,是说不设置lazy参数的时候吗?
    ……后面三句话好像有点抽象,能不能用它的Person和Address的例子简单说明下呢?再次谢谢了!
    ivanlw
        4
    ivanlw  
    OP
       2013-06-09 09:44:52 +08:00
    @TempAccount 嗯,明白了,这就去翻……
    leojoy710
        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...
    JhOOOn
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2914 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 00:34 · PVG 08:34 · LAX 16:34 · JFK 19:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.