【问题标题】:SQLalchemy, why flask sets Base.query?SQLalchemy,为什么烧瓶设置 Base.query?
【发布时间】:2017-02-17 23:30:13
【问题描述】:

official Flask documentation for declarative use of SQLalchemy 中使用了以下片段:

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:////tmp/test.db', convert_unicode=True)
db_session = scoped_session(sessionmaker(autocommit=False,
                                         autoflush=False,
                                         bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()

现在,我根本不明白最后一行在做什么。即是什么

Base.query = db_session.query_property()

执行。 为什么那条线在里面?

在我的应用程序中,我只是对每个数据库操作使用db_session。现在我玩了一点,发现在交互式会话或普通 python 脚本的上下文中,该行没有执行任何操作!

例如这个脚本打印True

import sqlalchemy as sq
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
eng = sq.create_engine('sqlite://')
Base = declarative_base()
db_session = scoped_session(sessionmaker(bind=eng))
Base.query = db_session.query_property()
Base.query
print(Base.query == None)

这个也是如此:

import sqlalchemy as sq
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session
eng = sq.create_engine('sqlite://')
Base = declarative_base(bind=eng)    ### the difference is here
db_session = scoped_session(sessionmaker(bind=eng))
Base.query = db_session.query_property()
Base.query
print(Base.query == None)

所以我很茫然。返回的基础对象似乎有一个__setattr__,这将不允许设置Base.query

  • 该作业应该做什么?
  • 为什么我的测试结果是Base.query 被分配了None
  • 默认情况下,Base 没有query 属性,但那么简单地做Base.query = None 会不会更容易?

(P.S. 这都是python 3.6)

【问题讨论】:

    标签: python-3.x flask sqlalchemy


    【解决方案1】:

    db_session.query_property 是一个描述符,它根据您访问它的类返回Query。例如,如果你有

    class Foo(Base):
        pass
    

    那么Foo.querydb_session.query(Foo) 的简写。那么,因为说db_session.query(Base)没有意义,所以Base.query自然就是None

    【讨论】:

    • 哇,现在说得通了。嘿,这就是我一直使用db_session.query 所得到的。非常感谢。
    猜你喜欢
    • 2015-09-28
    • 2012-12-29
    • 2021-02-21
    • 2014-07-20
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多