Skip to content

Commit 400750e

Browse files
author
Guido
committed
Add delete mutations
1 parent cc344c0 commit 400750e

File tree

4 files changed

+82
-17
lines changed

4 files changed

+82
-17
lines changed

src/graphql_sqlalchemy/args.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,20 @@
1919

2020

2121
def make_args(model: DeclarativeMeta, inputs: Inputs) -> GraphQLArgumentMap:
22-
args = {}
22+
args = {
23+
"order": GraphQLArgument(GraphQLList(GraphQLNonNull(get_order_type(model, inputs)))),
24+
"where": GraphQLArgument(get_where_type(model, inputs)),
25+
}
26+
2327
for name, field in PAGINATION_ARGS.items():
2428
args[name] = GraphQLArgument(field)
2529

26-
order_type = get_order_type(model, inputs)
27-
args["order"] = GraphQLArgument(GraphQLList(GraphQLNonNull(order_type)))
28-
29-
where_type = get_where_type(model, inputs)
30-
args["where"] = GraphQLArgument(where_type)
31-
3230
return args
3331

3432

35-
def make_pk_args(model: DeclarativeMeta) -> Optional[GraphQLArgumentMap]:
33+
def make_pk_args(model: DeclarativeMeta) -> GraphQLArgumentMap:
3634
primary_key = get_table(model).primary_key
3735

38-
if not primary_key:
39-
return None
40-
4136
args = {}
4237
for column in primary_key.columns:
4338
graphql_type = get_graphql_type_from_column(column)
@@ -58,3 +53,7 @@ def make_insert_one_args(model: DeclarativeMeta, inputs: Inputs) -> GraphQLArgum
5853
"object": GraphQLArgument(get_insert_type(model, inputs)),
5954
"on_conflict": GraphQLArgument(get_conflict_type(model, inputs)),
6055
}
56+
57+
58+
def make_delete_args(model: DeclarativeMeta, inputs: Inputs) -> GraphQLArgumentMap:
59+
return {"where": GraphQLArgument(get_where_type(model, inputs))}

src/graphql_sqlalchemy/names.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,11 @@ def get_model_constraint_key_name(model: DeclarativeMeta, column: Column, is_pri
5858

5959
def get_model_column_update_enum_name(model: DeclarativeMeta) -> str:
6060
return f"{get_table_name(model)}_update_column"
61+
62+
63+
def get_model_delete_name(model: DeclarativeMeta) -> str:
64+
return f"delete_{get_table_name(model)}"
65+
66+
67+
def get_model_delete_by_pk_name(model: DeclarativeMeta) -> str:
68+
return f"delete_{get_table_name(model)}_by_pk"

src/graphql_sqlalchemy/resolvers.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,3 +182,33 @@ def resolver(
182182
return instance
183183

184184
return resolver
185+
186+
187+
def make_delete_resolver(model: DeclarativeMeta) -> Callable:
188+
def resolver(
189+
_root: DeclarativeMeta, info: Any, where: Optional[Dict[str, Any]] = None
190+
) -> Dict[str, Union[int, List[DeclarativeMeta]]]:
191+
session = info.context["session"]
192+
query = session.query(model)
193+
query = filter_query(model, query, where)
194+
195+
rows = query.all()
196+
affected = query.delete()
197+
session.commit()
198+
199+
return {"affected_rows": affected, "returning": rows}
200+
201+
return resolver
202+
203+
204+
def make_delete_by_pk_resolver(model: DeclarativeMeta) -> Callable:
205+
def resolver(_root: DeclarativeMeta, info: Any, **kwargs: Dict[str, Any]) -> List[DeclarativeMeta]:
206+
session = info.context["session"]
207+
208+
row = session.query(model).get(kwargs)
209+
session.delete(row)
210+
session.commit()
211+
212+
return row
213+
214+
return resolver

src/graphql_sqlalchemy/schema.py

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,32 @@
77
GraphQLList,
88
)
99

10-
from .resolvers import make_object_resolver, make_pk_resolver, make_insert_resolver, make_insert_one_resolver
11-
from .args import make_args, make_pk_args, make_insert_args, make_insert_one_args
10+
from .resolvers import (
11+
make_object_resolver,
12+
make_pk_resolver,
13+
make_insert_resolver,
14+
make_insert_one_resolver,
15+
make_delete_resolver,
16+
make_delete_by_pk_resolver,
17+
)
18+
from .args import (
19+
make_args,
20+
make_pk_args,
21+
make_insert_args,
22+
make_insert_one_args,
23+
make_delete_args,
24+
)
1225
from .names import (
1326
get_model_pk_field_name,
1427
get_model_insert_object_name,
1528
get_model_insert_one_object_name,
1629
get_table_name,
30+
get_model_delete_name,
31+
get_model_delete_by_pk_name,
1732
)
1833
from .objects import build_object_type, build_mutation_response_type
1934
from .types import Objects, Inputs
35+
from .helpers import get_table
2036

2137

2238
def build_queries(model: DeclarativeMeta, objects: Objects, queries: GraphQLFieldMap, inputs: Inputs) -> None:
@@ -27,24 +43,36 @@ def build_queries(model: DeclarativeMeta, objects: Objects, queries: GraphQLFiel
2743
GraphQLList(object_type), args=make_args(model, inputs=inputs), resolve=make_object_resolver(model)
2844
)
2945

30-
pk_field_name = get_model_pk_field_name(model)
31-
queries[pk_field_name] = GraphQLField(object_type, args=make_pk_args(model), resolve=make_pk_resolver(model))
46+
if get_table(model).primary_key:
47+
pk_field_name = get_model_pk_field_name(model)
48+
queries[pk_field_name] = GraphQLField(object_type, args=make_pk_args(model), resolve=make_pk_resolver(model))
3249

3350

3451
def build_mutations(model: DeclarativeMeta, objects: Objects, mutations: GraphQLFieldMap, inputs: Inputs) -> None:
35-
insert_type_name = get_model_insert_object_name(model)
3652
mutation_response_type = build_mutation_response_type(model, objects)
53+
object_type = objects[get_table_name(model)]
3754

55+
insert_type_name = get_model_insert_object_name(model)
3856
mutations[insert_type_name] = GraphQLField(
3957
mutation_response_type, args=make_insert_args(model, inputs), resolve=make_insert_resolver(model)
4058
)
4159

4260
insert_one_type_name = get_model_insert_one_object_name(model)
43-
object_type = objects[get_table_name(model)]
4461
mutations[insert_one_type_name] = GraphQLField(
4562
object_type, args=make_insert_one_args(model, inputs), resolve=make_insert_one_resolver(model)
4663
)
4764

65+
delete_type_name = get_model_delete_name(model)
66+
mutations[delete_type_name] = GraphQLField(
67+
mutation_response_type, args=make_delete_args(model, inputs), resolve=make_delete_resolver(model)
68+
)
69+
70+
if get_table(model).primary_key:
71+
delete_by_pk_type_name = get_model_delete_by_pk_name(model)
72+
mutations[delete_by_pk_type_name] = GraphQLField(
73+
object_type, args=make_pk_args(model), resolve=make_delete_by_pk_resolver(model)
74+
)
75+
4876

4977
def build_schema(base: DeclarativeMeta) -> GraphQLSchema:
5078
queries: GraphQLFieldMap = {}

0 commit comments

Comments
 (0)