diff --git a/pydantic/__init__.py b/pydantic/__init__.py index 8a71bbd85c..929b7f705a 100644 --- a/pydantic/__init__.py +++ b/pydantic/__init__.py @@ -124,6 +124,7 @@ 'NatsDsn', 'MySQLDsn', 'MariaDBDsn', + 'ClickHouseDsn', 'validate_email', # root_model 'RootModel', @@ -277,6 +278,7 @@ 'NatsDsn': (__package__, '.networks'), 'MySQLDsn': (__package__, '.networks'), 'MariaDBDsn': (__package__, '.networks'), + 'ClickHouseDsn': (__package__, '.networks'), 'validate_email': (__package__, '.networks'), # root_model 'RootModel': (__package__, '.root_model'), diff --git a/pydantic/networks.py b/pydantic/networks.py index d8e6549f62..ece5919b64 100644 --- a/pydantic/networks.py +++ b/pydantic/networks.py @@ -45,6 +45,7 @@ 'validate_email', 'MySQLDsn', 'MariaDBDsn', + 'ClickHouseDsn', ] @@ -354,6 +355,20 @@ def check_db_name(cls, v): ] """A type that will accept any MariaDB DSN. +* User info required +* TLD not required +* Host required +""" +ClickHouseDsn = Annotated[ + Url, + UrlConstraints( + allowed_schemes=['clickhouse+native', 'clickhouse+asynch'], + default_host='localhost', + default_port=9000, + ), +] +"""A type that will accept any ClickHouse DSN. + * User info required * TLD not required * Host required diff --git a/tests/test_networks.py b/tests/test_networks.py index 427c22547c..bdd5e69679 100644 --- a/tests/test_networks.py +++ b/tests/test_networks.py @@ -9,6 +9,7 @@ AmqpDsn, AnyUrl, BaseModel, + ClickHouseDsn, CockroachDsn, FileUrl, HttpUrl, @@ -419,6 +420,20 @@ class Model(BaseModel): assert str(Model(a=dsn).a) == dsn +@pytest.mark.parametrize( + 'dsn', + [ + 'clickhouse+native://user:pass@localhost:9000/app', + 'clickhouse+asynch://user:pass@localhost:9000/app', + ], +) +def test_clickhouse_dsns(dsn): + class Model(BaseModel): + a: ClickHouseDsn + + assert str(Model(a=dsn).a) == dsn + + @pytest.mark.parametrize( 'dsn,error_message', (