summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES7
-rw-r--r--lib/sqlalchemy/databases/sqlite.py7
-rw-r--r--test/dialect/sqlite.py21
3 files changed, 12 insertions, 23 deletions
diff --git a/CHANGES b/CHANGES
index 00611fac4..68ac6ff89 100644
--- 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
========
diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py
index 620713fe1..26f1ecb91 100644
--- a/lib/sqlalchemy/databases/sqlite.py
+++ b/lib/sqlalchemy/databases/sqlite.py
@@ -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__:
diff --git a/test/dialect/sqlite.py b/test/dialect/sqlite.py
index a902ecb24..70d6923ca 100644
--- a/test/dialect/sqlite.py
+++ b/test/dialect/sqlite.py
@@ -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