]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- fixed specification of YEAR columns when generating schema
authorJason Kirtland <jek@discorporate.us>
Thu, 9 Aug 2007 19:26:14 +0000 (19:26 +0000)
committerJason Kirtland <jek@discorporate.us>
Thu, 9 Aug 2007 19:26:14 +0000 (19:26 +0000)
CHANGES
lib/sqlalchemy/databases/mysql.py
test/dialect/mysql.py

diff --git a/CHANGES b/CHANGES
index 4a6868df706db007dab58cc3421966fe6eab471b..e0a59eddacaaf8868045fede855fdf2bc9781f76 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -10,6 +10,8 @@
 - engine
     - fixed another occasional race condition which could occur
       when using pool with threadlocal setting
+- mysql
+    - fixed specification of YEAR columns when generating schema
 - mssql
     - added support for TIME columns (simulated using DATETIME) [ticket:679]
     - index names are now quoted when dropping from reflected tables [ticket:684]
index bac0e5e12abb6cfdcf52373caa103060f2debb67..dd69e4e0b799c6d72ca05d812c3e79248205c99d 100644 (file)
@@ -387,14 +387,17 @@ class MSTimeStamp(sqltypes.TIMESTAMP):
     def get_col_spec(self):
         return "TIMESTAMP"
 
-class MSYear(sqltypes.String):
+class MSYear(sqltypes.TypeEngine):
     """MySQL YEAR type, for single byte storage of years 1901-2155"""
 
+    def __init__(self, length=None):
+        self.length = length
+
     def get_col_spec(self):
         if self.length is None:
             return "YEAR"
         else:
-            return "YEAR(%d)" % self.length
+            return "YEAR(%s)" % self.length
 
 class MSText(_StringType, sqltypes.TEXT):
     """MySQL TEXT type, for text up to 2^16 characters""" 
@@ -938,6 +941,7 @@ ischema_names = {
     'tinytext' : MSTinyText,
     'varbinary' : MSVarBinary,
     'varchar' : MSString,
+    'year' : MSYear,
 }
 
 def descriptor():
index d9227383fc25423a39cc415e7a8b94c9733ec03d..ebeead507b0faefb87b80d939c38e364f70b5ebf 100644 (file)
@@ -208,6 +208,34 @@ class TypesTest(AssertMixin):
             raise
         charset_table.drop()
 
+    @testbase.supported('mysql')
+    def test_year(self):
+        """Exercise YEAR."""
+
+        meta = MetaData(testbase.db)
+        year_table = Table('mysql_year', meta,
+                           Column('y1', mysql.MSYear),
+                           Column('y2', mysql.MSYear),
+                           Column('y3', mysql.MSYear),
+                           Column('y4', mysql.MSYear(2)),
+                           Column('y5', mysql.MSYear(4)))
+
+        try:
+            year_table.create()
+            reflected = Table('mysql_year', MetaData(testbase.db),
+                              autoload=True)
+
+            for table in year_table, reflected:
+                table.insert(['1950', '50', None, 50, 1950]).execute()
+                row = list(table.select().execute())[0]
+                self.assert_(list(row) == [1950, 2050, None, 50, 1950])
+                table.delete().execute()
+                self.assert_(colspec(table.c.y1).startswith('y1 YEAR'))
+                self.assert_(colspec(table.c.y4) == 'y4 YEAR(2)')
+                self.assert_(colspec(table.c.y5) == 'y5 YEAR(4)')
+        finally:
+            meta.drop_all()
+
     @testbase.supported('mysql')
     def test_enum(self):
         "Exercise the ENUM type"
@@ -342,5 +370,10 @@ class TypesTest(AssertMixin):
 
         m.drop_all()
 
+
+def colspec(c):
+    return testbase.db.dialect.schemagenerator(
+        testbase.db, None, None).get_column_specification(c)
+
 if __name__ == "__main__":
     testbase.main()