From: Adam Žurek Date: Fri, 15 Nov 2024 18:12:54 +0000 (-0500) Subject: Added INET4 and INET6 types for MariaDB X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0f81c14b7cd9ac821205d6c48cf2393447058394;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Added INET4 and INET6 types for MariaDB Added sql types ``INET4`` and ``INET6`` in the MariaDB dialect. Fixes: #10720 Closes: #12028 Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/12028 Pull-request-sha: 25f939076eda0a763bc33fb0455d45ef00002110 Change-Id: I2efa53420aa5566f61a19f228cb421116b2e2720 --- diff --git a/doc/build/changelog/unreleased_20/10720.rst b/doc/build/changelog/unreleased_20/10720.rst new file mode 100644 index 0000000000..d676a4425d --- /dev/null +++ b/doc/build/changelog/unreleased_20/10720.rst @@ -0,0 +1,5 @@ +.. change:: + :tags: usecase, mariadb + :ticket: 10720 + + Added sql types ``INET4`` and ``INET6`` in the MariaDB dialect. diff --git a/doc/build/dialects/mysql.rst b/doc/build/dialects/mysql.rst index a46bf721e2..657cd2a418 100644 --- a/doc/build/dialects/mysql.rst +++ b/doc/build/dialects/mysql.rst @@ -56,7 +56,14 @@ valid with MySQL are importable from the top level dialect:: YEAR, ) -Types which are specific to MySQL, or have MySQL-specific +In addition to the above types, MariaDB also supports the following:: + + from sqlalchemy.dialects.mysql import ( + INET4, + INET6, + ) + +Types which are specific to MySQL or MariaDB, or have specific construction arguments, are as follows: .. note: where :noindex: is used, indicates a type that is not redefined @@ -117,6 +124,10 @@ construction arguments, are as follows: :members: __init__ +.. autoclass:: INET4 + +.. autoclass:: INET6 + .. autoclass:: INTEGER :members: __init__ diff --git a/lib/sqlalchemy/dialects/mysql/__init__.py b/lib/sqlalchemy/dialects/mysql/__init__.py index 60bac87443..05f41cf351 100644 --- a/lib/sqlalchemy/dialects/mysql/__init__.py +++ b/lib/sqlalchemy/dialects/mysql/__init__.py @@ -53,7 +53,8 @@ from .base import YEAR from .dml import Insert from .dml import insert from .expression import match -from ...util import compat +from .mariadb import INET4 +from .mariadb import INET6 # default dialect base.dialect = dialect = mysqldb.dialect @@ -71,6 +72,8 @@ __all__ = ( "DOUBLE", "ENUM", "FLOAT", + "INET4", + "INET6", "INTEGER", "INTEGER", "JSON", diff --git a/lib/sqlalchemy/dialects/mysql/mariadb.py b/lib/sqlalchemy/dialects/mysql/mariadb.py index b85dfff922..ea2586de3f 100644 --- a/lib/sqlalchemy/dialects/mysql/mariadb.py +++ b/lib/sqlalchemy/dialects/mysql/mariadb.py @@ -7,11 +7,31 @@ # mypy: ignore-errors from .base import MariaDBIdentifierPreparer from .base import MySQLDialect +from .base import MySQLTypeCompiler from ... import util +from ...sql import sqltypes from ...sql.sqltypes import UUID from ...sql.sqltypes import Uuid +class INET4(sqltypes.TypeEngine[str]): + """INET4 column type for MariaDB + + .. versionadded:: 2.0.37 + """ + + __visit_name__ = "INET4" + + +class INET6(sqltypes.TypeEngine[str]): + """INET6 column type for MariaDB + + .. versionadded:: 2.0.37 + """ + + __visit_name__ = "INET6" + + class _MariaDBUUID(UUID): def __init__(self, as_uuid: bool = True, native_uuid: bool = True): self.as_uuid = as_uuid @@ -38,6 +58,14 @@ class _MariaDBUUID(UUID): return None +class MariaDBTypeCompiler(MySQLTypeCompiler): + def visit_INET4(self, type_, **kwargs) -> str: + return "INET4" + + def visit_INET6(self, type_, **kwargs) -> str: + return "INET6" + + class MariaDBDialect(MySQLDialect): is_mariadb = True supports_statement_cache = True @@ -47,6 +75,7 @@ class MariaDBDialect(MySQLDialect): name = "mariadb" preparer = MariaDBIdentifierPreparer + type_compiler_cls = MariaDBTypeCompiler colspecs = util.update_copy(MySQLDialect.colspecs, {Uuid: _MariaDBUUID}) diff --git a/test/dialect/mysql/test_types.py b/test/dialect/mysql/test_types.py index 5c72d2ae88..284370c4ac 100644 --- a/test/dialect/mysql/test_types.py +++ b/test/dialect/mysql/test_types.py @@ -21,7 +21,7 @@ from sqlalchemy import TypeDecorator from sqlalchemy import types as sqltypes from sqlalchemy import UnicodeText from sqlalchemy.dialects.mysql import base as mysql -from sqlalchemy.dialects.mysql.mariadb import MariaDBDialect +from sqlalchemy.dialects.mysql import mariadb from sqlalchemy.testing import assert_raises from sqlalchemy.testing import assert_raises_message from sqlalchemy.testing import AssertsCompiledSQL @@ -494,6 +494,8 @@ class MariaDBUUIDTest(fixtures.TestBase, AssertsCompiledSQL): def test_compile_upper(self): self.assert_compile(sqltypes.UUID(), "UUID") + +class UUIDTest(fixtures.TestBase, AssertsCompiledSQL): @testing.combinations( (sqltypes.Uuid(), (10, 6, 5), "CHAR(32)"), (sqltypes.Uuid(native_uuid=False), (10, 6, 5), "CHAR(32)"), @@ -503,7 +505,7 @@ class MariaDBUUIDTest(fixtures.TestBase, AssertsCompiledSQL): (sqltypes.UUID(), (10, 7, 0), "UUID"), ) def test_mariadb_uuid_combinations(self, type_, version, res): - dialect = MariaDBDialect() + dialect = mariadb.MariaDBDialect() dialect.server_version_info = version dialect.supports_native_uuid = version >= (10, 7) self.assert_compile(type_, res, dialect=dialect) @@ -517,6 +519,17 @@ class MariaDBUUIDTest(fixtures.TestBase, AssertsCompiledSQL): self.assert_compile(type_, "CHAR(32)", dialect=dialect) +class INETMariadbTest(fixtures.TestBase, AssertsCompiledSQL): + __dialect__ = mariadb.MariaDBDialect() + + @testing.combinations( + (mariadb.INET4(), "INET4"), + (mariadb.INET6(), "INET6"), + ) + def test_mariadb_inet6(self, type_, res): + self.assert_compile(type_, res) + + class TypeRoundTripTest(fixtures.TestBase, AssertsExecutionResults): __dialect__ = mysql.dialect() __only_on__ = "mysql", "mariadb"