From: Rick Morrison Date: Thu, 26 Jul 2007 18:18:54 +0000 (+0000) Subject: mssql and test changes from trunk X-Git-Tag: rel_0_4_6~13 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6bbe6dc24dda3db1573a7d5b1919503997deca21;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git mssql and test changes from trunk --- diff --git a/CHANGES b/CHANGES index 981ce14629..eee6730b53 100644 --- a/CHANGES +++ b/CHANGES @@ -235,6 +235,10 @@ - cleanup to connection-bound sessions, SessionTransaction - postgres - fixed max identifier length (63) [ticket:571] + +- mssql + - added support for TIME columns (simulated using DATETIME) [ticket:679] + - index names are now quoted when dropping from reflected tables [ticket:684] 0.3.9 - general diff --git a/lib/sqlalchemy/databases/mssql.py b/lib/sqlalchemy/databases/mssql.py index f4656a0e26..2062914041 100644 --- a/lib/sqlalchemy/databases/mssql.py +++ b/lib/sqlalchemy/databases/mssql.py @@ -98,6 +98,29 @@ class MSDate(sqltypes.Date): def get_col_spec(self): return "SMALLDATETIME" +class MSTime(sqltypes.Time): + __zero_date = datetime.date(1900, 1, 1) + + def __init__(self, *a, **kw): + super(MSTime, self).__init__(False) + + def get_col_spec(self): + return "DATETIME" + + def convert_bind_param(self, value, dialect): + if isinstance(value, datetime.datetime): + value = datetime.datetime.combine(self.__zero_date, value.time()) + elif isinstance(value, datetime.time): + value = datetime.datetime.combine(self.__zero_date, value) + return value + + def convert_result_value(self, value, dialect): + if isinstance(value, datetime.datetime): + return value.time() + elif isinstance(value, datetime.date): + return datetime.time(0, 0, 0) + return value + class MSDateTime_adodbapi(MSDateTime): def convert_result_value(self, value, dialect): # adodbapi will return datetimes with empty time values as datetime.date() objects. @@ -305,6 +328,7 @@ class MSSQLDialect(ansisql.ANSIDialect): sqltypes.Float : MSFloat, sqltypes.DateTime : MSDateTime, sqltypes.Date : MSDate, + sqltypes.Time : MSTime, sqltypes.String : MSString, sqltypes.Binary : MSBinary, sqltypes.Boolean : MSBoolean, @@ -893,9 +917,13 @@ class MSSQLSchemaGenerator(ansisql.ANSISchemaGenerator): class MSSQLSchemaDropper(ansisql.ANSISchemaDropper): def visit_index(self, index): - self.append("\nDROP INDEX " + index.table.name + "." + index.name) + self.append("\nDROP INDEX %s.%s" % ( + self.preparer.quote_identifier(index.table.name), + self.preparer.quote_identifier(index.name) + )) self.execute() + class MSSQLDefaultRunner(ansisql.ANSIDefaultRunner): # TODO: does ms-sql have standalone sequences ? pass diff --git a/test/sql/testtypes.py b/test/sql/testtypes.py index d0ec06caa8..6b2c98d79b 100644 --- a/test/sql/testtypes.py +++ b/test/sql/testtypes.py @@ -281,7 +281,7 @@ class DateTest(AssertMixin): collist = [Column('user_id', INT, primary_key = True), Column('user_name', VARCHAR(20)), Column('user_datetime', DateTime), Column('user_date', Date), Column('user_time', TIMESTAMP)] - elif db.engine.name == 'mysql' or db.engine.name == 'mssql': + elif db.engine.name == 'mysql': # these dont really support the TIME type at all insert_data = [ [7, 'jack', datetime.datetime(2005, 11, 10, 0, 0), datetime.datetime(2005, 11, 10, 0, 0, 0)], @@ -302,6 +302,10 @@ class DateTest(AssertMixin): [10, 'colber', None, None, None] ] + if db.engine.name == 'mssql': + # MSSQL Datetime values have only a 3.33 milliseconds precision + insert_data[2] = [9, 'foo', datetime.datetime(2005, 11, 10, 11, 52, 35, 547000), datetime.date(1970,4,1), datetime.time(23,59,59,997000)] + fnames = ['user_id', 'user_name', 'user_datetime', 'user_date', 'user_time'] collist = [Column('user_id', INT, primary_key = True), Column('user_name', VARCHAR(20)), Column('user_datetime', DateTime(timezone=False)),