]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Fixed bug in MySQL reflection where the "fractional sections portion"
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 7 Dec 2015 22:24:09 +0000 (17:24 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 7 Dec 2015 22:24:09 +0000 (17:24 -0500)
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

doc/build/changelog/changelog_10.rst
lib/sqlalchemy/dialects/mysql/base.py
test/dialect/mysql/test_reflection.py

index 6fc75b18b17cd13f2411263d3ec6e2c0e2ac84d8..3e7f6fd29b17a91ec2ff5afc41249f12cfdc14fe 100644 (file)
 .. 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
index ad3ffa6f8c1e340c392b5e134e383370f6911a26..988746403832086bfb181fec807fe62f471c6aa1 100644 (file)
@@ -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
index 024567828f071e3792c9aee68c8ce6b740a88857..09499fae480d8e0d919c0da3509d046592ccfa1f 100644 (file)
@@ -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()),