From: Mike Bayer Date: Mon, 7 Dec 2015 22:24:09 +0000 (-0500) Subject: - Fixed bug in MySQL reflection where the "fractional sections portion" X-Git-Tag: rel_1_1_0b1~84^2~70^2~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3f42743d6aa1326a80a0ed720a92266aa5fbf209;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Fixed bug in MySQL reflection where the "fractional sections portion" of the :class:`.mysql.DATETIME`, :class:`.mysql.TIMESTAMP` and :class:`.mysql.TIME` types would be incorrectly placed into the ``timestamp`` attribute, which is unused by MySQL, instead of the ``fsp`` attribute. fixes #3602 --- diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index 6fc75b18b1..3e7f6fd29b 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -18,6 +18,17 @@ .. changelog:: :version: 1.0.10 + .. change:: + :tags: bug, mysql + :tickets: 3602 + :versions: 1.1.0b1 + + Fixed bug in MySQL reflection where the "fractional sections portion" + of the :class:`.mysql.DATETIME`, :class:`.mysql.TIMESTAMP` and + :class:`.mysql.TIME` types would be incorrectly placed into the + ``timestamp`` attribute, which is unused by MySQL, instead of the + ``fsp`` attribute. + .. change:: :tags: bug, orm :tickets: 3599 diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index ad3ffa6f8c..9887464038 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -3094,6 +3094,11 @@ class MySQLTableDefinitionParser(object): # Column type keyword options type_kw = {} + + if issubclass(col_type, (DATETIME, TIME, TIMESTAMP)): + if type_args: + type_kw['fsp'] = type_args.pop(0) + for kw in ('unsigned', 'zerofill'): if spec.get(kw, False): type_kw[kw] = True diff --git a/test/dialect/mysql/test_reflection.py b/test/dialect/mysql/test_reflection.py index 024567828f..09499fae48 100644 --- a/test/dialect/mysql/test_reflection.py +++ b/test/dialect/mysql/test_reflection.py @@ -72,8 +72,14 @@ class TypeReflectionTest(fixtures.TestBase): specs = [] for type_ in (mysql.TIMESTAMP, mysql.DATETIME, mysql.TIME): - typespec = type_() - specs.append((typespec, typespec)) + # MySQL defaults fsp to 0, and if 0 does not report it. + # we don't actually render 0 right now in DDL but even if we do, + # it comes back blank + for fsp in (None, 0, 5): + if fsp: + specs.append((type_(fsp=fsp), type_(fsp=fsp))) + else: + specs.append((type_(), type_())) specs.extend([ (TIMESTAMP(), mysql.TIMESTAMP()),