From 6b27537988ed849682afb9fa3b713dbf33174651 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Wed, 7 Dec 2022 17:18:40 -0800 Subject: [PATCH] ignore/replace to create requires pk, refs #1927 --- datasette/views/database.py | 5 +++++ tests/test_api_write.py | 27 +++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/datasette/views/database.py b/datasette/views/database.py index f5f329d8..1afc1c47 100644 --- a/datasette/views/database.py +++ b/datasette/views/database.py @@ -605,6 +605,11 @@ class TableCreateView(BaseView): if not data.get("row") and not data.get("rows"): return _error(["ignore and replace require row or rows"]) + # ignore and replace require pk or pks + if "ignore" in data or "replace" in data: + if not data.get("pk") and not data.get("pks"): + return _error(["ignore and replace require pk or pks"]) + ignore = data.get("ignore") replace = data.get("replace") diff --git a/tests/test_api_write.py b/tests/test_api_write.py index 813097b2..135e09f8 100644 --- a/tests/test_api_write.py +++ b/tests/test_api_write.py @@ -1083,6 +1083,31 @@ async def test_drop_table(ds_write, scenario): "errors": ["ignore and replace require row or rows"], }, ), + # ignore and replace require pk or pks + ( + { + "table": "bad", + "row": {"id": 1}, + "ignore": True, + }, + 400, + { + "ok": False, + "errors": ["ignore and replace require pk or pks"], + }, + ), + ( + { + "table": "bad", + "row": {"id": 1}, + "replace": True, + }, + 400, + { + "ok": False, + "errors": ["ignore and replace require pk or pks"], + }, + ), ), ) async def test_create_table(ds_write, input, expected_status, expected_response): @@ -1115,6 +1140,7 @@ async def test_create_table(ds_write, input, expected_status, expected_response) {"id": 1, "name": "Row 1 new"}, {"id": 3, "name": "Row 3 new"}, ], + "pk": "id", "ignore": True, }, [ @@ -1130,6 +1156,7 @@ async def test_create_table(ds_write, input, expected_status, expected_response) {"id": 1, "name": "Row 1 new"}, {"id": 3, "name": "Row 3 new"}, ], + "pk": "id", "replace": True, }, [