diff options
author | mike bayer <mike_mp@zzzcomputing.com> | 2020-12-03 17:39:51 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2020-12-03 17:39:51 +0000 |
commit | abf6b65453e4afd5f7de73f98607037435381081 (patch) | |
tree | 3dc7ec7894586f3c7b9f141628428d22c010d644 | |
parent | 84e70eb9a23a8fd8f0e2f4c82f8cbf5b3a97c72b (diff) | |
parent | aabf16a14748a5746c97cce9c301ccb8ac05b418 (diff) | |
download | sqlalchemy-abf6b65453e4afd5f7de73f98607037435381081.tar.gz |
Merge "Reflect decimal points in MariaDB non-quoted numeric defaults" into rel_1_3
-rw-r--r-- | doc/build/changelog/unreleased_13/5744.rst | 10 | ||||
-rw-r--r-- | lib/sqlalchemy/dialects/mysql/reflection.py | 4 | ||||
-rw-r--r-- | test/dialect/mysql/test_reflection.py | 19 |
3 files changed, 31 insertions, 2 deletions
diff --git a/doc/build/changelog/unreleased_13/5744.rst b/doc/build/changelog/unreleased_13/5744.rst new file mode 100644 index 000000000..7325279e8 --- /dev/null +++ b/doc/build/changelog/unreleased_13/5744.rst @@ -0,0 +1,10 @@ +.. 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. + diff --git a/lib/sqlalchemy/dialects/mysql/reflection.py b/lib/sqlalchemy/dialects/mysql/reflection.py index 2cb9b3a6d..00400c138 100644 --- a/lib/sqlalchemy/dialects/mysql/reflection.py +++ b/lib/sqlalchemy/dialects/mysql/reflection.py @@ -381,8 +381,8 @@ class MySQLTableDefinitionParser(object): 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)?)?" diff --git a/test/dialect/mysql/test_reflection.py b/test/dialect/mysql/test_reflection.py index dfc7992d2..b11ecd489 100644 --- a/test/dialect/mysql/test_reflection.py +++ b/test/dialect/mysql/test_reflection.py @@ -235,6 +235,9 @@ class ReflectionTest(fixtures.TestBase, AssertsCompiledSQL): 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( @@ -259,6 +262,8 @@ class ReflectionTest(fixtures.TestBase, AssertsCompiledSQL): ) ), ), + Column("c7", mysql.DOUBLE(), DefaultClause("0.0000")), + Column("c8", mysql.DOUBLE(22, 6), DefaultClause("0.0000")), ) def_table.create() try: @@ -278,6 +283,15 @@ class ReflectionTest(fixtures.TestBase, AssertsCompiledSQL): 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(), @@ -298,6 +312,11 @@ class ReflectionTest(fixtures.TestBase, AssertsCompiledSQL): 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(), |