18

このアサートは常にパスするかどうか? つまり、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)

なし、実稼働環境では postgresql を使用しています。sqlite はテスト用です。

4

2 に答える 2

18

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)

そして、これは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の作業単位と呼ばれる概念があることがわかりました: http://www.aosabook.org/en/sqlalchemy.html ( Unit of Work を検索します)。

同じクラス内では、順序は実際addに呼び出された順序によって決定されます。ただし、異なるクラス間で INSERT の順序が異なる場合があります。タイプのオブジェクトを追加し、後でaタイプのオブジェクトを追加しても、外部キーが にあることが判明した場合、INSERT for の前に INSERT forが表示されます。AbBabba

于 2013-11-14T23:42:36.657 に答える
-3

いいえ、追加時ではなく、コミット時にそれらを行います。

于 2012-04-14T14:36:26.727 に答える