From 415d1ae30ff31244d738b1b0da019a40d98fc28d Mon Sep 17 00:00:00 2001 From: markus-96 <73887906+markus-96@users.noreply.github.com> Date: Thu, 23 Jan 2025 12:03:42 +0100 Subject: [PATCH] fix `_get_dialects` - properties (#1859) * fix `_get_dialects` --------- Co-authored-by: Waket Zheng --- CHANGELOG.rst | 1 + tests/test_early_init.py | 10 ++++- tests/utils/test_describe_model.py | 65 ++++++++++++++++++++++++------ tortoise/fields/base.py | 22 ++++++---- 4 files changed, 76 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 4226e6ac9..a361bde98 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -15,6 +15,7 @@ Fixed ^^^^^ - Rename pypika to pypika_tortoise for fixing package name conflict (#1829) - Concurrent connection pool initialization (#1825) +- `_get_dialects`: support properties (#1859) Changed ^^^^^^^ diff --git a/tests/test_early_init.py b/tests/test_early_init.py index 831bc032e..87dbd4015 100644 --- a/tests/test_early_init.py +++ b/tests/test_early_init.py @@ -109,7 +109,10 @@ async def test_early_init(self): "description": "The Event NAME", "docstring": "The Event NAME\nIt's pretty important", "constraints": {"max_length": 255}, - "db_field_types": {"": "VARCHAR(255)"}, + "db_field_types": { + "": "VARCHAR(255)", + "oracle": "NVARCHAR2(255)", + }, }, { "name": "created_at", @@ -252,7 +255,10 @@ async def test_early_init(self): "name": "name", "field_type": "CharField", "db_column": "name", - "db_field_types": {"": "VARCHAR(255)"}, + "db_field_types": { + "": "VARCHAR(255)", + "oracle": "NVARCHAR2(255)", + }, "python_type": "str", "generated": False, "nullable": False, diff --git a/tests/utils/test_describe_model.py b/tests/utils/test_describe_model.py index 8c21fc1e7..ca9700ae6 100644 --- a/tests/utils/test_describe_model.py +++ b/tests/utils/test_describe_model.py @@ -171,7 +171,10 @@ def test_describe_model_straight(self): "name": "chars", "field_type": "CharField", "db_column": "chars", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": "str", "generated": False, "nullable": False, @@ -186,7 +189,10 @@ def test_describe_model_straight(self): "name": "blip", "field_type": "CharField", "db_column": "blip", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": "str", "generated": False, "nullable": False, @@ -201,7 +207,10 @@ def test_describe_model_straight(self): "name": "nullable", "field_type": "CharField", "db_column": "nullable", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": "str", "generated": False, "nullable": True, @@ -391,7 +400,10 @@ def test_describe_model_straight_native(self): "name": "chars", "field_type": fields.CharField, "db_column": "chars", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": str, "generated": False, "nullable": False, @@ -406,7 +418,10 @@ def test_describe_model_straight_native(self): "name": "blip", "field_type": fields.CharField, "db_column": "blip", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": str, "generated": False, "nullable": False, @@ -421,7 +436,10 @@ def test_describe_model_straight_native(self): "name": "nullable", "field_type": fields.CharField, "db_column": "nullable", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": str, "generated": False, "nullable": True, @@ -611,7 +629,10 @@ def test_describe_model_source(self): "name": "chars", "field_type": "CharField", "db_column": "some_chars_table", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": "str", "generated": False, "nullable": False, @@ -626,7 +647,10 @@ def test_describe_model_source(self): "name": "blip", "field_type": "CharField", "db_column": "da_blip", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": "str", "generated": False, "nullable": False, @@ -641,7 +665,10 @@ def test_describe_model_source(self): "name": "nullable", "field_type": "CharField", "db_column": "some_nullable", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": "str", "generated": False, "nullable": True, @@ -831,7 +858,10 @@ def test_describe_model_source_native(self): "name": "chars", "field_type": fields.CharField, "db_column": "some_chars_table", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": str, "generated": False, "nullable": False, @@ -846,7 +876,10 @@ def test_describe_model_source_native(self): "name": "blip", "field_type": fields.CharField, "db_column": "da_blip", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": str, "generated": False, "nullable": False, @@ -861,7 +894,10 @@ def test_describe_model_source_native(self): "name": "nullable", "field_type": fields.CharField, "db_column": "some_nullable", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "python_type": str, "generated": False, "nullable": True, @@ -1180,7 +1216,10 @@ def test_describe_model_uuidpk_relatednull(self): "data_fields": [ { "db_column": "name", - "db_field_types": {"": "VARCHAR(50)"}, + "db_field_types": { + "": "VARCHAR(50)", + "oracle": "NVARCHAR2(50)", + }, "default": None, "description": None, "docstring": None, diff --git a/tortoise/fields/base.py b/tortoise/fields/base.py index 68f66781c..6912ea4cd 100644 --- a/tortoise/fields/base.py +++ b/tortoise/fields/base.py @@ -296,17 +296,25 @@ def constraints(self) -> dict: def _get_dialects(self) -> dict[str, dict]: ret = {} - for dialect in [key for key in dir(self) if key.startswith("_db_")]: - item = {} + for dialect in dir(self): + if not dialect.startswith("_db_"): + continue cls = getattr(self, dialect) + d = cls.__dict__ try: - cls = cls(self) + obj = cls(self) except TypeError: pass - for key, val in cls.__dict__.items(): - if not key.startswith("_"): - item[key] = val - ret[dialect[4:]] = item + else: + props = { + prop: getattr(obj, prop) + for prop in dir(cls) + if isinstance(getattr(cls, prop), property) + } + d = {**d, **props} + + ret[dialect[4:]] = {k: v for k, v in d.items() if not k.startswith("_")} + return ret def get_db_field_types(self) -> Optional[dict[str, str]]: