В official Flask documentation for declarative use of SQLalchemy следующие отрезала используется:SQLalchemy, почему колбы наборы Base.query?
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
?
(постскриптум Это весь питон 3,6)
Вау, теперь это имеет смысл. Хех, это то, что я получаю от использования db_session.query'. Большое спасибо. – grochmal