Skip to content

Commit 415a7aa

Browse files
committed
Drop support for delete by primary key
1 parent da683a7 commit 415a7aa

File tree

5 files changed

+56
-67
lines changed

5 files changed

+56
-67
lines changed

sqlalchemy_bind_manager/_repository/async_.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -93,17 +93,9 @@ async def get_many(self, identifiers: Iterable[PRIMARY_KEY]) -> List[MODEL]:
9393
async with self._get_session(commit=False) as session:
9494
return [x for x in (await session.execute(stmt)).scalars()]
9595

96-
async def delete(
97-
self,
98-
entity: Union[MODEL, PRIMARY_KEY],
99-
) -> None:
100-
# TODO: delete without loading the model
101-
if isinstance(entity, self._model):
102-
obj = entity
103-
else:
104-
obj = await self.get(entity) # type: ignore
96+
async def delete(self, instance: MODEL) -> None:
10597
async with self._get_session() as session:
106-
await session.delete(obj)
98+
await session.delete(instance)
10799

108100
async def find(
109101
self,

sqlalchemy_bind_manager/_repository/sync.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,9 @@ def get_many(self, identifiers: Iterable[PRIMARY_KEY]) -> List[MODEL]:
8282
with self._get_session(commit=False) as session:
8383
return [x for x in session.execute(stmt).scalars()]
8484

85-
def delete(self, entity: Union[MODEL, PRIMARY_KEY]) -> None:
86-
# TODO: delete without loading the model
87-
if isinstance(entity, self._model):
88-
obj = entity
89-
else:
90-
obj = self.get(entity) # type: ignore
85+
def delete(self, instance: MODEL) -> None:
9186
with self._get_session() as session:
92-
session.delete(obj)
87+
session.delete(instance)
9388

9489
def find(
9590
self,

sqlalchemy_bind_manager/protocols.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,10 @@ async def get_many(self, identifiers: Iterable[PRIMARY_KEY]) -> List[MODEL]:
5959
"""
6060
...
6161

62-
async def delete(self, entity: Union[MODEL, PRIMARY_KEY]) -> None:
62+
async def delete(self, instance: MODEL) -> None:
6363
"""Deletes a model.
6464
65-
:param entity: The model instance or the primary key
66-
:type entity: Union[MODEL, PRIMARY_KEY]
65+
:param instance: The model instance or the primary key
6766
"""
6867
...
6968

@@ -197,7 +196,6 @@ def get(self, identifier: PRIMARY_KEY) -> MODEL:
197196
:return: A model instance
198197
:raises ModelNotFound: No model has been found using the primary key
199198
"""
200-
# TODO: implement get_many()
201199
...
202200

203201
def get_many(self, identifiers: Iterable[PRIMARY_KEY]) -> List[MODEL]:
@@ -210,11 +208,10 @@ def get_many(self, identifiers: Iterable[PRIMARY_KEY]) -> List[MODEL]:
210208
"""
211209
...
212210

213-
def delete(self, entity: Union[MODEL, PRIMARY_KEY]) -> None:
211+
def delete(self, instance: MODEL) -> None:
214212
"""Deletes a model.
215213
216-
:param entity: The model instance or the primary key
217-
:type entity: Union[MODEL, PRIMARY_KEY]
214+
:param instance: The model instance or the primary key
218215
"""
219216
...
220217

tests/repository/async_/test_delete.py

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,5 @@
11
import pytest
2-
3-
4-
async def test_can_delete_by_pk(repository_class, model_class, sa_manager):
5-
model = model_class(
6-
model_id=1,
7-
name="Someone",
8-
)
9-
model2 = model_class(
10-
model_id=2,
11-
name="SomeoneElse",
12-
)
13-
repo = repository_class(sa_manager.get_bind())
14-
await repo.save_many({model, model2})
15-
16-
results = [x for x in await repo.find()]
17-
assert len(results) == 2
18-
19-
await repo.delete(1)
20-
results = [x for x in await repo.find()]
21-
assert len(results) == 1
22-
assert results[0].model_id == 2
23-
assert results[0].name == "SomeoneElse"
2+
from sqlalchemy import select
243

254

265
async def test_can_delete_by_instance(repository_class, model_class, sa_manager):
@@ -55,3 +34,26 @@ async def test_delete_inexistent_raises_exception(
5534

5635
with pytest.raises(Exception):
5736
await repo.delete(4)
37+
38+
39+
async def test_relationships_are_respected(
40+
related_repository_class, related_model_classes, sa_manager
41+
):
42+
parent = related_model_classes[0](
43+
name="A Parent",
44+
)
45+
child = related_model_classes[1](name="A Child")
46+
child2 = related_model_classes[1](name="Another Child")
47+
parent.children.append(child)
48+
parent.children.append(child2)
49+
repo = related_repository_class(sa_manager.get_bind())
50+
await repo.save(parent)
51+
52+
retrieved_parent = await repo.get(parent.parent_model_id)
53+
assert len(retrieved_parent.children) == 2
54+
55+
await repo.delete(retrieved_parent)
56+
57+
async with repo._get_session() as session:
58+
result = [x for x in (await session.execute(select(related_model_classes[1]))).scalars()]
59+
assert len(result) == 0

tests/repository/sync/test_delete.py

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,6 @@
11
import pytest
22

3-
4-
def test_can_delete_by_pk(repository_class, model_class, sa_manager):
5-
model = model_class(
6-
model_id=1,
7-
name="Someone",
8-
)
9-
model2 = model_class(
10-
model_id=2,
11-
name="SomeoneElse",
12-
)
13-
repo = repository_class(sa_manager.get_bind())
14-
repo.save_many({model, model2})
15-
16-
results = [x for x in repo.find()]
17-
assert len(results) == 2
18-
19-
repo.delete(1)
20-
results = [x for x in repo.find()]
21-
assert len(results) == 1
22-
assert results[0].model_id == 2
23-
assert results[0].name == "SomeoneElse"
3+
from sqlalchemy import select
244

255

266
def test_can_delete_by_instance(repository_class, model_class, sa_manager):
@@ -53,3 +33,26 @@ def test_delete_inexistent_raises_exception(repository_class, model_class, sa_ma
5333

5434
with pytest.raises(Exception):
5535
repo.delete(4)
36+
37+
38+
def test_relationships_are_respected(
39+
related_repository_class, related_model_classes, sa_manager
40+
):
41+
parent = related_model_classes[0](
42+
name="A Parent",
43+
)
44+
child = related_model_classes[1](name="A Child")
45+
child2 = related_model_classes[1](name="Another Child")
46+
parent.children.append(child)
47+
parent.children.append(child2)
48+
repo = related_repository_class(sa_manager.get_bind())
49+
repo.save(parent)
50+
51+
retrieved_parent = repo.get(parent.parent_model_id)
52+
assert len(retrieved_parent.children) == 2
53+
54+
repo.delete(retrieved_parent)
55+
56+
with repo._get_session() as session:
57+
result = [x for x in session.execute(select(related_model_classes[1])).scalars()]
58+
assert len(result) == 0

0 commit comments

Comments
 (0)