feat: Add cascade deletion for datasets and data
Added cascade deletion so when a dataset or data is deleted the connection in the dataset_data table is also deleted Feature #COG-455
This commit is contained in:
parent
eca1b9fddd
commit
de1ba5cd7c
4 changed files with 22 additions and 6 deletions
|
|
@ -89,10 +89,22 @@ class SQLAlchemyAdapter():
|
|||
"""
|
||||
Delete data in given table based on id. Table must have an id Column.
|
||||
"""
|
||||
async with self.get_async_session() as session:
|
||||
TableModel = await self.get_table(table_name, schema_name)
|
||||
await session.execute(TableModel.delete().where(TableModel.c.id == data_id))
|
||||
await session.commit()
|
||||
if self.engine.dialect.name == "sqlite":
|
||||
async with self.get_async_session() as session:
|
||||
TableModel = await self.get_table(table_name, schema_name)
|
||||
|
||||
# Foreign key constraints are disabled by default in SQLite (for backwards compatibility),
|
||||
# so must be enabled for each database connection/session separately.
|
||||
await session.execute(text("PRAGMA foreign_keys = ON;"))
|
||||
|
||||
await session.execute(TableModel.delete().where(TableModel.c.id == data_id))
|
||||
await session.commit()
|
||||
else:
|
||||
async with self.get_async_session() as session:
|
||||
TableModel = await self.get_table(table_name, schema_name)
|
||||
await session.execute(TableModel.delete().where(TableModel.c.id == data_id))
|
||||
await session.commit()
|
||||
|
||||
|
||||
async def get_table(self, table_name: str, schema_name: Optional[str] = "public") -> Table:
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -20,9 +20,11 @@ class Data(Base):
|
|||
updated_at = Column(DateTime(timezone = True), onupdate = lambda: datetime.now(timezone.utc))
|
||||
|
||||
datasets: Mapped[List["Dataset"]] = relationship(
|
||||
"Dataset",
|
||||
secondary = DatasetData.__tablename__,
|
||||
back_populates = "data",
|
||||
lazy = "noload",
|
||||
cascade="all, delete"
|
||||
)
|
||||
|
||||
def to_json(self) -> dict:
|
||||
|
|
|
|||
|
|
@ -19,9 +19,11 @@ class Dataset(Base):
|
|||
owner_id = Column(UUID, index = True)
|
||||
|
||||
data: Mapped[List["Data"]] = relationship(
|
||||
"Data",
|
||||
secondary = DatasetData.__tablename__,
|
||||
back_populates = "datasets",
|
||||
lazy = "noload",
|
||||
cascade="all, delete"
|
||||
)
|
||||
|
||||
def to_json(self) -> dict:
|
||||
|
|
|
|||
|
|
@ -7,5 +7,5 @@ class DatasetData(Base):
|
|||
|
||||
created_at = Column(DateTime(timezone = True), default = lambda: datetime.now(timezone.utc))
|
||||
|
||||
dataset_id = Column(UUID, ForeignKey("datasets.id"), primary_key = True)
|
||||
data_id = Column(UUID, ForeignKey("data.id"), primary_key = True)
|
||||
dataset_id = Column(UUID, ForeignKey("datasets.id", ondelete="CASCADE"), primary_key = True)
|
||||
data_id = Column(UUID, ForeignKey("data.id", ondelete="CASCADE"), primary_key = True)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue