From: Mike Bayer Date: Sun, 17 Jun 2007 00:10:04 +0000 (+0000) Subject: - sqlite better handles datetime/date/time objects mixed and matched X-Git-Tag: rel_0_3_9~79 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=93215f429db15d8cf94dfc9f889efb828c6707f2;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - sqlite better handles datetime/date/time objects mixed and matched with various Date/Time/DateTime columns --- diff --git a/CHANGES b/CHANGES index 62118dab13..ce3e86c2c0 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,10 @@ up ORM decision making [ticket:593] - mysql - added 'fields' to reserved words [ticket:590] +- sqlite + - sqlite better handles datetime/date/time objects mixed and matched + with various Date/Time/DateTime columns + 0.3.8 - engines diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py index 7c5cbccbe5..aaaf55697f 100644 --- a/lib/sqlalchemy/databases/sqlite.py +++ b/lib/sqlalchemy/databases/sqlite.py @@ -32,11 +32,14 @@ class SLSmallInteger(sqltypes.Smallinteger): class DateTimeMixin(object): def convert_bind_param(self, value, dialect): if value is not None: - return str(value) + if getattr(value, 'microsecond', None) is not None: + return value.strftime(self.__format__ + "." + str(value.microsecond)) + else: + return value.strftime(self.__format__) else: return None - def _cvt(self, value, dialect, fmt): + def _cvt(self, value, dialect): if value is None: return None try: @@ -44,30 +47,36 @@ class DateTimeMixin(object): microsecond = int(microsecond) except ValueError: (value, microsecond) = (value, 0) - return time.strptime(value, fmt)[0:6] + (microsecond,) + return time.strptime(value, self.__format__)[0:6] + (microsecond,) class SLDateTime(DateTimeMixin,sqltypes.DateTime): + __format__ = "%Y-%m-%d %H:%M:%S" + def get_col_spec(self): return "TIMESTAMP" def convert_result_value(self, value, dialect): - tup = self._cvt(value, dialect, "%Y-%m-%d %H:%M:%S") + tup = self._cvt(value, dialect) return tup and datetime.datetime(*tup) class SLDate(DateTimeMixin, sqltypes.Date): + __format__ = "%Y-%m-%d" + def get_col_spec(self): return "DATE" def convert_result_value(self, value, dialect): - tup = self._cvt(value, dialect, "%Y-%m-%d") + tup = self._cvt(value, dialect) return tup and datetime.date(*tup[0:3]) class SLTime(DateTimeMixin, sqltypes.Time): + __format__ = "%H:%M:%S" + def get_col_spec(self): return "TIME" def convert_result_value(self, value, dialect): - tup = self._cvt(value, dialect, "%H:%M:%S") + tup = self._cvt(value, dialect) return tup and datetime.time(*tup[3:7]) class SLText(sqltypes.TEXT): diff --git a/test/sql/testtypes.py b/test/sql/testtypes.py index 376546ee88..3d4d4ecce6 100644 --- a/test/sql/testtypes.py +++ b/test/sql/testtypes.py @@ -335,7 +335,6 @@ class DateTest(AssertMixin): #x = db.text("select * from query_users_with_date where user_datetime=:date", bindparams=[bindparam('date', )]).execute(date=datetime.datetime(2005, 11, 10, 11, 52, 35)).fetchall() #print repr(x) - @testbase.unsupported('sqlite') def testdate2(self): t = Table('testdate', testbase.metadata, Column('id', Integer, primary_key=True), Column('adate', Date), Column('adatetime', DateTime))