--- /dev/null
+.. change::
+ :tags: mysql, bug
+ :tickets: 4650
+
+ Added support for DROP CHECK constraint which is required by MySQL 8.0.16
+ to drop a CHECK constraint; MariaDB supports plain DROP CONSTRAINT. The
+ logic distinguishes between the two syntaxes by checking the server version
+ string for MariaDB presence. Alembic migrations has already worked
+ around this issue by implementing its own DROP for MySQL / MariaDB CHECK
+ constraints, however this change implements it straight in Core so that its
+ available for general use. Pull request courtesy Hannes Hansen.
elif isinstance(constraint, sa_schema.UniqueConstraint):
qual = "INDEX "
const = self.preparer.format_constraint(constraint)
+ elif isinstance(constraint, sa_schema.CheckConstraint):
+ if self.dialect._is_mariadb:
+ qual = "CONSTRAINT "
+ else:
+ qual = "CHECK "
+ const = self.preparer.format_constraint(constraint)
else:
qual = ""
const = self.preparer.format_constraint(constraint)
@property
def _is_mariadb(self):
- return "MariaDB" in self.server_version_info
+ return (
+ self.server_version_info and "MariaDB" in self.server_version_info
+ )
@property
def _is_mysql(self):
- return "MariaDB" not in self.server_version_info
+ return not self._is_mariadb
@property
def _is_mariadb_102(self):
from sqlalchemy import Boolean
from sqlalchemy import cast
from sqlalchemy import CHAR
+from sqlalchemy import CheckConstraint
from sqlalchemy import CLOB
from sqlalchemy import Column
from sqlalchemy import DATE
"CREATE INDEX test_idx2 ON testtbl (data(5))",
)
+ def test_drop_constraint_mysql(self):
+ m = MetaData()
+ table_name = "testtbl"
+ constraint_name = "constraint"
+ constraint = CheckConstraint("data IS NOT NULL", name=constraint_name)
+ tbl = Table(table_name, m, Column("data", String(255)), constraint)
+ dialect = mysql.dialect()
+ self.assert_compile(
+ schema.DropConstraint(constraint),
+ "ALTER TABLE %s DROP CHECK `%s`"
+ % (table_name, constraint_name),
+ dialect=dialect
+ )
+
+ def test_drop_constraint_mariadb(self):
+ m = MetaData()
+ table_name = "testtbl"
+ constraint_name = "constraint"
+ constraint = CheckConstraint("data IS NOT NULL", name=constraint_name)
+ tbl = Table(table_name, m, Column("data", String(255)), constraint)
+ dialect = mysql.dialect()
+ dialect.server_version_info = (10, 1, 1, "MariaDB")
+ self.assert_compile(
+ schema.DropConstraint(constraint),
+ "ALTER TABLE %s DROP CONSTRAINT `%s`"
+ % (table_name, constraint_name),
+ dialect=dialect
+ )
+
def test_create_index_with_length_quoted(self):
m = MetaData()
tbl = Table(