SQLalchemy,为什么flask 设置Base.query?

gro*_*mal 6 sqlalchemy flask python-3.x

声明性使用 SQLalchemy官方 Flask 文档中,使用了以下片段

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()
Run Code Online (Sandbox Code Playgroud)

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

Base.query = db_session.query_property()
Run Code Online (Sandbox Code Playgroud)

施行。 为什么那条线在那里?

在我的应用程序中,我只是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)
Run Code Online (Sandbox Code Playgroud)

这个也是如此:

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)
Run Code Online (Sandbox Code Playgroud)

所以我不知所措。返回的基础对象似乎有一个__setattr__不允许设置Base.query.

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

(PS 这都是python 3.6)

uni*_*rio 10

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

class Foo(Base):
    pass
Run Code Online (Sandbox Code Playgroud)

thenFoo.query是 的简写db_session.query(Foo)。那么,因为说的毫无意义db_session.query(Base)Base.query自然是None