--- /dev/null
+.. change::
+ :tags: bug, mysql, reflection
+ :tickets: 5744
+ :versions: 1.4.0b2
+
+ Fixed issue where reflecting a server default on MariaDB only that
+ contained a decimal point in the value would fail to be reflected
+ correctly, leading towards a reflected table that lacked any server
+ default.
+
r"(?: +COLLATE +(?P<collate>[\w_]+))?"
r"(?: +(?P<notnull>(?:NOT )?NULL))?"
r"(?: +DEFAULT +(?P<default>"
- r"(?:NULL|'(?:''|[^'])*'|[\w\(\)]+"
- r"(?: +ON UPDATE [\w\(\)]+)?)"
+ r"(?:NULL|'(?:''|[^'])*'|[\w\.\(\)]+"
+ r"(?: +ON UPDATE [\w\.\(\)]+)?)"
r"))?"
r"(?: +(?:GENERATED ALWAYS)? ?AS +(?P<generated>\("
r".*\))? ?(?P<persistence>VIRTUAL|STORED)?)?"
def test_default_reflection(self):
"""Test reflection of column defaults."""
+ # TODO: this test is a mess. should be broken into individual
+ # combinations
+
from sqlalchemy.dialects.mysql import VARCHAR
def_table = Table(
)
),
),
+ Column("c7", mysql.DOUBLE(), DefaultClause("0.0000")),
+ Column("c8", mysql.DOUBLE(22, 6), DefaultClause("0.0000")),
)
def_table.create()
try:
assert reflected.c.c5.default is None
assert reflected.c.c5.server_default is None
assert reflected.c.c6.default is None
+ assert str(reflected.c.c7.server_default.arg) in ("0", "'0'")
+
+ # this is because the numeric is 6 decimal places, MySQL
+ # formats it to that many places.
+ assert str(reflected.c.c8.server_default.arg) in (
+ "0.000000",
+ "'0.000000'",
+ )
+
assert re.match(
r"CURRENT_TIMESTAMP(\(\))? ON UPDATE CURRENT_TIMESTAMP(\(\))?",
str(reflected.c.c6.server_default.arg).upper(),
assert reflected.c.c5.default is None
assert reflected.c.c5.server_default is None
assert reflected.c.c6.default is None
+ assert str(reflected.c.c7.server_default.arg) in ("0", "'0'")
+ assert str(reflected.c.c8.server_default.arg) in (
+ "0.000000",
+ "'0.000000'",
+ )
assert re.match(
r"CURRENT_TIMESTAMP(\(\))? ON UPDATE CURRENT_TIMESTAMP(\(\))?",
str(reflected.c.c6.server_default.arg).upper(),