From cde7983a0a770f742906950f6279ba2ed467fb4d Mon Sep 17 00:00:00 2001 From: Jason Kirtland Date: Thu, 9 Aug 2007 19:26:14 +0000 Subject: [PATCH] - fixed specification of YEAR columns when generating schema --- CHANGES | 2 ++ lib/sqlalchemy/databases/mysql.py | 8 ++++++-- test/dialect/mysql.py | 33 +++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 4a6868df70..e0a59eddac 100644 --- 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] diff --git a/lib/sqlalchemy/databases/mysql.py b/lib/sqlalchemy/databases/mysql.py index bac0e5e12a..dd69e4e0b7 100644 --- a/lib/sqlalchemy/databases/mysql.py +++ b/lib/sqlalchemy/databases/mysql.py @@ -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(): diff --git a/test/dialect/mysql.py b/test/dialect/mysql.py index d9227383fc..ebeead507b 100644 --- a/test/dialect/mysql.py +++ b/test/dialect/mysql.py @@ -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() -- 2.47.2