From: Mike Bayer Date: Sat, 13 Jul 2013 01:52:54 +0000 (-0400) Subject: The newly added SQLite DATETIME arguments storage_format and X-Git-Tag: rel_0_8_3~95 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2edc13a6b82b264beba0b20f96f252d7b7a96f28;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git The newly added SQLite DATETIME arguments storage_format and regexp apparently were not fully implemented correctly; while the arguments were accepted, in practice they would have no effect; this has been fixed. [ticket:2781] --- diff --git a/doc/build/changelog/changelog_08.rst b/doc/build/changelog/changelog_08.rst index a7d28430a0..55fd7949a1 100644 --- a/doc/build/changelog/changelog_08.rst +++ b/doc/build/changelog/changelog_08.rst @@ -6,6 +6,15 @@ .. changelog:: :version: 0.8.3 + .. change:: + :tags: bug, sqlite + :tickets: 2781 + + The newly added SQLite DATETIME arguments storage_format and + regexp apparently were not fully implemented correctly; while the + arguments were accepted, in practice they would have no effect; + this has been fixed. + .. change:: :tags: bug, sql, postgresql :tickets: 2780 diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index 085ff51f12..6032a62de9 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -153,6 +153,12 @@ class _DateTimeMixin(object): if storage_format is not None: self._storage_format = storage_format + def adapt(self, cls, **kw): + if self._storage_format: + kw["storage_format"] = self._storage_format + if self._reg: + kw["regexp"] = self._reg + return util.constructor_copy(self, cls, **kw) class DATETIME(_DateTimeMixin, sqltypes.DateTime): """Represent a Python datetime object in SQLite using a string. diff --git a/test/dialect/test_sqlite.py b/test/dialect/test_sqlite.py index e70485cfd7..cf5a4f521f 100644 --- a/test/dialect/test_sqlite.py +++ b/test/dialect/test_sqlite.py @@ -93,6 +93,52 @@ class TestTypes(fixtures.TestBase, AssertsExecutionResults): t.drop(engine) engine.dispose() + @testing.provide_metadata + def test_custom_datetime(self): + sqlite_date = sqlite.DATETIME( + # 2004-05-21T00:00:00 + storage_format="%(year)04d-%(month)02d-%(day)02d" + "T%(hour)02d:%(minute)02d:%(second)02d", + regexp=r"(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)", + ) + t = Table('t', self.metadata, Column('d', sqlite_date)) + self.metadata.create_all(testing.db) + testing.db.execute(t.insert(). + values(d=datetime.datetime(2010, 10, 15, 12, 37, 0))) + testing.db.execute("insert into t (d) values ('2004-05-21T00:00:00')") + eq_( + testing.db.execute("select * from t order by d").fetchall(), + [(u'2004-05-21T00:00:00',), (u'2010-10-15T12:37:00',)] + ) + eq_( + testing.db.execute(select([t.c.d]).order_by(t.c.d)).fetchall(), + [(datetime.datetime(2004, 5, 21, 0, 0),), + (datetime.datetime(2010, 10, 15, 12, 37),)] + ) + + @testing.provide_metadata + def test_custom_date(self): + sqlite_date = sqlite.DATE( + # 2004-05-21T00:00:00 + storage_format="%(year)04d|%(month)02d|%(day)02d", + regexp=r"(\d+)\|(\d+)\|(\d+)", + ) + t = Table('t', self.metadata, Column('d', sqlite_date)) + self.metadata.create_all(testing.db) + testing.db.execute(t.insert(). + values(d=datetime.date(2010, 10, 15))) + testing.db.execute("insert into t (d) values ('2004|05|21')") + eq_( + testing.db.execute("select * from t order by d").fetchall(), + [(u'2004|05|21',), (u'2010|10|15',)] + ) + eq_( + testing.db.execute(select([t.c.d]).order_by(t.c.d)).fetchall(), + [(datetime.date(2004, 5, 21),), + (datetime.date(2010, 10, 15),)] + ) + + def test_no_convert_unicode(self): """test no utf-8 encoding occurs""" @@ -218,7 +264,6 @@ class DateTimeTest(fixtures.TestBase, AssertsCompiledSQL): rp = sldt.result_processor(None, None) eq_(rp(bp(dt)), dt) - class DateTest(fixtures.TestBase, AssertsCompiledSQL): def test_default(self):