sqlalchemy,如何使用级联Base.metadata.drop_all?

muj*_*uji 5 python sqlalchemy pytest

我正在为我的 pytest 测试构建设置和拆卸。我无法删除表,因为表之间存在大量依赖关系。不过,每次测试后我都需要删除所有表。

@pytest.fixture()
def test_db():
    model.Base.metadata.create_all(bind=test_engine)
    db = TestSessionLocal()
    yield db
    model.Base.metadata.drop_all(bind=test_engine)
Run Code Online (Sandbox Code Playgroud)

它让我震惊psycopg2.errors.DependentObjectsStillExist

我还在我的模型中包含了级联,但它不起作用。

class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    email = Column(String, unique=True, index=True)
    name = Column(String)
    surname = Column(String)
    position = Column(String)
    skills = relationship("UserSkills", cascade="all, delete", passive_deletes=True)
    manager = Column(Integer, ForeignKey("manager.id", ondelete='CASCADE'))
    account_type = Column(Enum(AccountType), default=AccountType.USER)
    created = Column(DateTime, default=datetime.datetime.utcnow)
Run Code Online (Sandbox Code Playgroud)

如何添加级联选项model.Base.metadata.drop_all(bind=test_engine)

小智 0

要将级联选项添加到metadata.drop_all(bind=engine),您需要在每个外键关系中指定它。级联onupdate也是如此。

我的项目示例:

room_facility_id = Column(Integer, ForeignKey('hotel_room_facility.id', ondelete='CASCADE', onupdate='CASCADE'), nullable=False)
Run Code Online (Sandbox Code Playgroud)