diff --git a/ormar/fields/model_fields.py b/ormar/fields/model_fields.py index ac1d534..9455f8d 100644 --- a/ormar/fields/model_fields.py +++ b/ormar/fields/model_fields.py @@ -91,7 +91,9 @@ class ModelFieldFactory: nullable, default, server_default, pydantic_only ) or is_auto_primary_key(primary_key, autoincrement) sql_nullable = ( - nullable if sql_nullable is None else (sql_nullable and not primary_key) + False + if primary_key + else (nullable if sql_nullable is None else sql_nullable) ) namespace = dict( diff --git a/tests/test_model_definition/test_pk_field_is_always_not_null.py b/tests/test_model_definition/test_pk_field_is_always_not_null.py new file mode 100644 index 0000000..22b03a3 --- /dev/null +++ b/tests/test_model_definition/test_pk_field_is_always_not_null.py @@ -0,0 +1,39 @@ +import databases +import sqlalchemy + +import ormar +from tests.settings import DATABASE_URL + +database = databases.Database(DATABASE_URL) +metadata = sqlalchemy.MetaData() + + +class BaseMeta(ormar.ModelMeta): + metadata = metadata + database = database + + +class AutoincrementModel(ormar.Model): + class Meta(BaseMeta): + pass + + id: int = ormar.Integer(primary_key=True) + + +class NonAutoincrementModel(ormar.Model): + class Meta(BaseMeta): + pass + + id: int = ormar.Integer(primary_key=True, autoincrement=False) + + +class ExplicitNullableModel(ormar.Model): + class Meta(BaseMeta): + pass + + id: int = ormar.Integer(primary_key=True, nullable=True) + + +def test_pk_field_is_not_null(): + for model in [AutoincrementModel, NonAutoincrementModel, ExplicitNullableModel]: + assert not model.Meta.table.c.get("id").nullable