1

delete_entityエンティティを削除する関数を作成し、この関数をテストする関数を作成しました。

#__init__.py
engine = create_engine('sqlite://:memory')
Session = scoped_session(sessionmaker(engine))

# entity.py
def delete_entity(id, commit=False):
  """ Delete entity and return amount of amount of rows affected. """
  rows_affected = Session.query(Entity).filter(Entity.id == id).delete()
  if commit:
    Session.commit()
    # Marker @A

  return rows_affected

# test_entity.py
def test_delete_entity(Session):
   # ... Here I add 2 Entity objects. Database now contains 2 rows.

   assert delete_entity(1) == 1                 # Not committed, row stays in database.
   assert delete_entity(1, commmit=True)        # Row should be deleted 
   # marker @B 
   assert len(Session.query(Entity).all()) == 1

test_delete_entity() このテストは、単独で実行すると合格します。しかし、このテストを他のテストと一緒に実行すると、このテストは失敗します。で失敗しassert len(Session.query(Entity)).all()) == 1ます。クエリは 2 行を検出するため、行が削除されていないように見えます。しかし、@A で Python デバッガー ( pytest.set_trace()) を使用し、データベース内のすべてのエンティティ オブジェクトに対してクエリを実行すると、1 行が見つかります。したがって、削除クエリは成功し、1 行が削除されました。しかし、@BI ですべてのエンティティ行を照会すると、2 行が取得されます。

両方のセッションを「同期」して、テストに合格するにはどうすればよいですか?

4

1 に答える 1

0

試してみましたが、問題を再現できませんでした。結果を含む完全なスクリプトは次のとおりです。

import sqlalchemy as sa

from sqlalchemy import create_engine, Column, Integer, Unicode
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base


engine = create_engine('sqlite://', echo=True)

Base = declarative_base(bind=engine)
Session = scoped_session(sessionmaker(bind=engine))


class Entity(Base):
    __tablename__ = 'test_table'
    id = Column(Integer(), primary_key=True)
    name = Column(Unicode(200))


Base.metadata.create_all()

e1 = Entity()
e1.name = 'first row'
e2 = Entity()
e2.name = 'second row'

Session.add_all([e1, e2])
Session.commit()

print len(Session.query(Entity).all())
# CORRECTLY prints 2

rows_affected = Session.query(Entity).filter(Entity.id == 1).delete()
print rows_affected
# CORRECTLY prints 1
Session.commit()

print len(Session.query(Entity).all())
# CORRECTLY prints 1

あなたのスクリプトは実行できないため、問題を見つけることができません。

私が行ったように、問題全体を表示する実行可能なスクリプトを提供してください。スクリプトは、すべてのインポート、データの挿入、削除、および最後にクエリを実行する必要があります。そうしないと、私の環境では再現できません。

于 2013-11-15T11:08:47.930 に答える