]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Added INET4 and INET6 types for MariaDB
authorAdam Žurek <thejabko@gmail.com>
Fri, 15 Nov 2024 18:12:54 +0000 (13:12 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 19 Nov 2024 13:59:25 +0000 (08:59 -0500)
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

doc/build/changelog/unreleased_20/10720.rst [new file with mode: 0644]
doc/build/dialects/mysql.rst
lib/sqlalchemy/dialects/mysql/__init__.py
lib/sqlalchemy/dialects/mysql/mariadb.py
test/dialect/mysql/test_types.py

diff --git a/doc/build/changelog/unreleased_20/10720.rst b/doc/build/changelog/unreleased_20/10720.rst
new file mode 100644 (file)
index 0000000..d676a44
--- /dev/null
@@ -0,0 +1,5 @@
+.. change::
+    :tags: usecase, mariadb
+    :ticket: 10720
+
+    Added sql types ``INET4`` and ``INET6`` in the MariaDB dialect.
index a46bf721e21cd3f4f10186a7833bfcd1458d334c..657cd2a41893aee23c574305ed0614860e08e062 100644 (file)
@@ -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__
 
index 60bac87443d47bee0a5e419e5967a66d96b70f4f..05f41cf351234f261b0ac8d15d1c3fd638169791 100644 (file)
@@ -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",
index b85dfff9226bec505a2e56a3581f69f0e7d19a1c..ea2586de3fe1b2e3ae4d04f2231c6c09cf8b6b1d 100644 (file)
@@ -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})
 
index 5c72d2ae8879c3407d897fdf31b2a59a4e9dd454..284370c4ac76d632463eaca1f28b1f654dae514d 100644 (file)
@@ -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"