【发布时间】: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