]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- SQLite Date, DateTime, and Time types only accept Python
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 9 Jul 2008 16:15:14 +0000 (16:15 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 9 Jul 2008 16:15:14 +0000 (16:15 +0000)
datetime objects now, not strings.  If you'd like to format
dates as strings yourself with SQLite, use a String type.
If you'd like them to return datetime objects anyway despite
their accepting strings as input, make a TypeDecorator around
String - SQLA doesn't encourage this pattern.

CHANGES
lib/sqlalchemy/databases/sqlite.py
test/dialect/sqlite.py

diff --git a/CHANGES b/CHANGES
index 00611fac4792648c345bd2323510003bfe1c0b56..68ac6ff893fa8203f0efe564a8c508d5e2c5d405 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -72,6 +72,13 @@ CHANGES
       Then use "t" as the type on the Column.
            
       [ticket:1090]
+
+    - SQLite Date, DateTime, and Time types only accept Python
+      datetime objects now, not strings.  If you'd like to format
+      dates as strings yourself with SQLite, use a String type.
+      If you'd like them to return datetime objects anyway despite 
+      their accepting strings as input, make a TypeDecorator around 
+      String - SQLA doesn't encourage this pattern.
       
 0.5beta1
 ========
index 620713fe1c4533d8bc43391972cbb09db0cf2c0d..26f1ecb911615d3c78365d5314800146e8b9c0ca 100644 (file)
@@ -12,7 +12,7 @@ from sqlalchemy.engine import default
 import sqlalchemy.types as sqltypes
 import sqlalchemy.util as util
 from sqlalchemy.sql import compiler, functions as sql_functions
-
+from types import NoneType
 
 SELECT_REGEXP = re.compile(r'\s*(?:SELECT|PRAGMA)', re.I | re.UNICODE)
 
@@ -59,9 +59,8 @@ class DateTimeMixin(object):
     
     def bind_processor(self, dialect):
         def process(value):
-            if isinstance(value, basestring):
-                # pass string values thru
-                return value
+            if not isinstance(value, (NoneType, datetime.date, datetime.datetime, datetime.time)):
+                raise TypeError("SQLite Date, Time, and DateTime types only accept Python datetime objects as input.r")
             elif value is not None:
                 if self.__microsecond__ and getattr(value, 'microsecond', None) is not None:
                     if self.__legacy_microseconds__:
index a902ecb24215e07d91024943eefa51ae19b3afb8..70d6923ca5ded935cb34f67132c3c713a63e67d3 100644 (file)
@@ -11,25 +11,8 @@ from testlib import *
 class TestTypes(TestBase, AssertsExecutionResults):
     __only_on__ = 'sqlite'
 
-    def test_date(self):
-        meta = MetaData(testing.db)
-        t = Table('testdate', meta,
-                  Column('id', Integer, primary_key=True),
-                  Column('adate', Date),
-                  Column('adatetime', DateTime))
-        meta.create_all()
-        try:
-            d1 = datetime.date(2007, 10, 30)
-            d2 = datetime.datetime(2007, 10, 30)
-
-            t.insert().execute(adate=str(d1), adatetime=str(d2))
-
-            self.assert_(t.select().execute().fetchall()[0] ==
-                         (1, datetime.date(2007, 10, 30),
-                          datetime.datetime(2007, 10, 30)))
-
-        finally:
-            meta.drop_all()
+    def test_string_dates_raise(self):
+        self.assertRaises(TypeError, testing.db.execute, select([1]).where(bindparam("date", type_=Date)), date=str(datetime.date(2007, 10, 30)))
     
     def test_time_microseconds(self):
         dt = datetime.datetime(2008, 6, 27, 12, 0, 0, 125)  # 125 usec