Я пытаюсь понять код, который выполняет примерно следующее:
# db.py module
engine = create_engine(DB_URL, pool_timeout=20, pool_recycle=1)
def get_session():
return scoped_session(sessionmaker(bind=engine, expire_on_commit=False))()
def get_base():
base = automap_base()
base.prepare(engine, reflect=True)
return base
base = get_base()
User = base.classes.user
в некоторой функции:
# other.py module
from db import get_base, get_session, User
def some_func():
sess = get_session()
# do something with sess and User:
user = sess.query(User).first()
User2 = get_base().classes.user
try:
check = sess.query(User2).first()
except:
sess.rollback()
# do more with sess
sess.commit()
some_func
можно вызвать, например, в задаче сельдерея, но никакие гринлеты или другие подобные трюки параллелизма обезьян не используются.
Мне интересно, чего можно достичь путем повторного сопоставления метаданных?Верно ли мое понимание, тогда из-за ограниченного сеанса SQLAlchemy в любом случае будет иметь один и тот же объект?И в этом случае даже сессия кажется одинаковой.
В чем может быть смысл?
Хотя моё предположение о получении того же объекта неверно:
(Pdb) pp user
<sqlalchemy.ext.automap.user object at 0x7f62e1a57390>
(Pdb) pp check
<sqlalchemy.ext.automap.user object at 0x7f62e0e93750>
(Pdb) pp user == check
False
(Pdb) pp user.id
1L
(Pdb) pp check.id
1L
(id
является первичным ключом, то есть уникальным)
Так что, похоже, SQLAlchemy хранит объекты из разных баз отдельно.
На данный момент я думаю, что этот трюк позволяетнапример, проверка существования пользователя вне текущей транзакции.