From: Adam Žurek Date: Fri, 15 Nov 2024 18:12:54 +0000 (-0500) Subject: Added INET4 and INET6 types for MariaDB X-Git-Tag: rel_2_0_37~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d206a2635084d25de9011eceac204cdc8448c397;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 (cherry picked from commit 0f81c14b7cd9ac821205d6c48cf2393447058394) --- 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 10a05f9cb3..be7aebeaeb 100644 --- a/lib/sqlalchemy/dialects/mysql/mariadb.py +++ b/lib/sqlalchemy/dialects/mysql/mariadb.py @@ -7,6 +7,34 @@ # mypy: ignore-errors from .base import MariaDBIdentifierPreparer from .base import MySQLDialect +from .base import MySQLTypeCompiler +from ...sql import sqltypes + + +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 MariaDBTypeCompiler(MySQLTypeCompiler): + def visit_INET4(self, type_, **kwargs) -> str: + return "INET4" + + def visit_INET6(self, type_, **kwargs) -> str: + return "INET6" class MariaDBDialect(MySQLDialect): @@ -14,6 +42,7 @@ class MariaDBDialect(MySQLDialect): supports_statement_cache = True name = "mariadb" preparer = MariaDBIdentifierPreparer + type_compiler_cls = MariaDBTypeCompiler def loader(driver): diff --git a/test/dialect/mysql/test_types.py b/test/dialect/mysql/test_types.py index c73e82a945..2e5033ec57 100644 --- a/test/dialect/mysql/test_types.py +++ b/test/dialect/mysql/test_types.py @@ -21,6 +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 import mariadb from sqlalchemy.testing import assert_raises from sqlalchemy.testing import assert_raises_message from sqlalchemy.testing import AssertsCompiledSQL @@ -474,6 +475,17 @@ class TypeCompileTest(fixtures.TestBase, AssertsCompiledSQL): self.assert_compile(type_, sql_text) +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"