Tah*_*gir 11 python database orm sqlalchemy
这种断言是否总是通过?换句话说,在向会话添加新对象时,SQLAlchemy是否保存顺序(在生成INSERT查询时)?
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.session import sessionmaker
from sqlalchemy.engine import create_engine
from sqlalchemy.types import Integer
from sqlalchemy.schema import Column
engine = create_engine('sqlite://')
Base = declarative_base(engine)
Session = sessionmaker(bind=engine)
session = Session()
class Entity(Base):
__tablename__ = 'entity'
id = Column(Integer(), primary_key=True)
Entity.__table__.create(checkfirst=True)
first = Entity()
session.add(first)
second = Entity()
session.add(second)
session.commit()
assert second.id > first.id
print(first.id, second.id)
Run Code Online (Sandbox Code Playgroud)
没有,在生产中我使用postgresql,sqlite用于测试.
mun*_*nch 12
在查看SQLAlchemy源代码之后,它看起来像add()插入时的记录:https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/session.py#L1719
相关片段:
def _save_impl(self, state):
if state.key is not None:
raise sa_exc.InvalidRequestError(
"Object '%s' already has an identity - it can't be registered "
"as pending" % state_str(state))
self._before_attach(state)
if state not in self._new:
self._new[state] = state.obj()
state.insert_order = len(self._new) # THE INSERT ORDER IS SAVED!
self._attach(state)
Run Code Online (Sandbox Code Playgroud)
这是从Session.add=> self._save_or_update_state=> self._save_or_update_impl=> 调用的self._save_impl.
它在_sort_states保存时使用:https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/orm/persistence.py#L859
不幸的是,这只是实施级证明.我在文档中找不到任何保证它的东西......
更新:我已经对此进行了更多研究,结果发现在SQLAlchemy中有一个名为Unit of Work的概念,它有点定义了刷新期间的顺序:http://www.aosabook.org/en/sqlalchemy.html(寻找工作单位).
在同一个类中,顺序确实由add被调用的顺序决定.但是,您可能会在不同类之间的INSERT中看到不同的顺序.如果你添加a了类型的对象,A然后添加b了类型的对象B,但a结果是有一个外键b,你会在INSERT b之前看到一个INSERT a.