diff --git a/sqlite_utils/db.py b/sqlite_utils/db.py index 34836b8..c988174 100644 --- a/sqlite_utils/db.py +++ b/sqlite_utils/db.py @@ -336,7 +336,7 @@ class Database: column_extras.append("PRIMARY KEY") if column_name in not_null: column_extras.append("NOT NULL") - if column_name in defaults: + if column_name in defaults and defaults[column_name] is not None: column_extras.append( "DEFAULT {}".format(self.escape(defaults[column_name])) ) @@ -736,9 +736,9 @@ class Table(Queryable): drop=None, pk=pk, not_null=not_null, + defaults=defaults, # foreign_keys=foreign_keys, # column_order=column_order, - # defaults=defaults, # hash_id=hash_id, # extracts=extracts, ) @@ -754,6 +754,7 @@ class Table(Queryable): drop=None, pk=None, not_null=None, + defaults=None, tmp_suffix=None, ): columns = columns or {} @@ -795,16 +796,27 @@ class Table(Queryable): elif isinstance(not_null, set): create_table_not_null.update(rename.get(k) or k for k in not_null) + # defaults= + create_table_defaults = { + (rename.get(c.name) or c.name): c.default_value + for c in self.columns + if c.default_value is not None + } + if defaults is not None: + create_table_defaults.update( + {rename.get(c) or c: v for c, v in defaults.items()} + ) + sqls.append( self.db.create_table_sql( new_table_name, dict(new_column_pairs), pk=pk, not_null=create_table_not_null, + defaults=create_table_defaults, # foreign_keys=foreign_keys, # column_order=column_order, # not_null=not_null, - # defaults=defaults, # hash_id=hash_id, # extracts=extracts, ).strip() diff --git a/tests/test_transform.py b/tests/test_transform.py index e7a885e..6016033 100644 --- a/tests/test_transform.py +++ b/tests/test_transform.py @@ -129,3 +129,33 @@ def test_transform_add_not_null_with_rename(fresh_db, not_null): dogs.schema == 'CREATE TABLE "dogs" (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT,\n [dog_age] TEXT NOT NULL\n)' ) + + +def test_transform_defaults(fresh_db): + dogs = fresh_db["dogs"] + dogs.insert({"id": 1, "name": "Cleo", "age": 5}, pk="id") + dogs.transform(defaults={"age": 1}) + assert ( + dogs.schema + == 'CREATE TABLE "dogs" (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT,\n [age] INTEGER DEFAULT 1\n)' + ) + + +def test_transform_defaults_and_rename_column(fresh_db): + dogs = fresh_db["dogs"] + dogs.insert({"id": 1, "name": "Cleo", "age": 5}, pk="id") + dogs.transform(rename={"age": "dog_age"}, defaults={"age": 1}) + assert ( + dogs.schema + == 'CREATE TABLE "dogs" (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT,\n [dog_age] INTEGER DEFAULT 1\n)' + ) + + +def test_remove_defaults(fresh_db): + dogs = fresh_db["dogs"] + dogs.insert({"id": 1, "name": "Cleo", "age": 5}, defaults={"age": 1}, pk="id") + dogs.transform(defaults={"age": None}) + assert ( + dogs.schema + == 'CREATE TABLE "dogs" (\n [id] INTEGER PRIMARY KEY,\n [name] TEXT,\n [age] INTEGER\n)' + )