From 341f000097ca687317a6c007ec50e310e77df2b5 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sat, 27 Aug 2022 15:42:47 -0700 Subject: [PATCH] not_null support for .create(transform=True), refs #467 --- sqlite_utils/db.py | 5 +++++ tests/test_create.py | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index 0b741b3..24ca51c 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -929,6 +929,11 @@ class Database: desired_pk = list(pk) if desired_pk and current_pks != desired_pk: needs_transform = True + # Any not-null changes? + current_not_null = {c.name for c in table.columns if c.notnull} + desired_not_null = set(not_null) if not_null else set() + if current_not_null != desired_not_null: + needs_transform = True # Only run .transform() if there is something to do # TODO: what about not null and defaults? if needs_transform: diff --git a/tests/test_create.py b/tests/test_create.py index 6909e6f..42a6a2a 100644 --- a/tests/test_create.py +++ b/tests/test_create.py @@ -1197,6 +1197,13 @@ def test_create_if_no_columns(fresh_db): "CREATE TABLE [demo] (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT\n)", False, ), + # Change not null + ( + {"id": int, "name": str}, + {"pk": "id", "not_null": {"name"}}, + 'CREATE TABLE "demo" (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT NOT NULL\n)', + True, + ), ), ) def test_create_transform(fresh_db, cols, kwargs, expected_schema, should_transform): @@ -1205,8 +1212,8 @@ def test_create_transform(fresh_db, cols, kwargs, expected_schema, should_transf traces = [] with fresh_db.tracer(lambda sql, parameters: traces.append((sql, parameters))): fresh_db["demo"].create(cols, **kwargs, transform=True) - new_schema = fresh_db["demo"].schema - assert new_schema == expected_schema, repr(new_schema) at_least_one_create_table = any(sql.startswith("CREATE TABLE") for sql, _ in traces) assert should_transform == at_least_one_create_table + new_schema = fresh_db["demo"].schema + assert new_schema == expected_schema, repr(new_schema) assert fresh_db["demo"].count == 1