summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2008-09-19 20:42:51 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2008-09-19 20:42:51 +0000
commit9256e868627e64d2d877924c6a26f69312c886d9 (patch)
treedef4143229d24a151089e8416440c142206d24b0
parent51d623d4692616536e9879ddd9c1145cab210aeb (diff)
downloadsqlalchemy-9256e868627e64d2d877924c6a26f69312c886d9.tar.gz
- Supplied a custom strftime() function which
handles dates before 1900. [ticket:968] - removed a few bogus classes from util
-rw-r--r--CHANGES4
-rw-r--r--lib/sqlalchemy/databases/sqlite.py6
-rw-r--r--lib/sqlalchemy/util.py63
-rw-r--r--test/sql/testtypes.py40
4 files changed, 58 insertions, 55 deletions
diff --git a/CHANGES b/CHANGES
index 206d2cb5f..433f812ad 100644
--- a/CHANGES
+++ b/CHANGES
@@ -24,6 +24,10 @@ CHANGES
- mysql
- Added MSMediumInteger type [ticket:1146].
+- sqlite
+ - Supplied a custom strftime() function which
+ handles dates before 1900. [ticket:968]
+
- oracle
- has_sequence() now takes schema name into account
[ticket:1155]
diff --git a/lib/sqlalchemy/databases/sqlite.py b/lib/sqlalchemy/databases/sqlite.py
index b4af46221..aef819d0c 100644
--- a/lib/sqlalchemy/databases/sqlite.py
+++ b/lib/sqlalchemy/databases/sqlite.py
@@ -65,11 +65,11 @@ class DateTimeMixin(object):
elif value is not None:
if self.__microsecond__ and getattr(value, 'microsecond', None) is not None:
if self.__legacy_microseconds__:
- return value.strftime(self.__format__ + '.' + str(value.microsecond))
+ return util.strftime(value, self.__format__ + '.' + str(value.microsecond))
else:
- return value.strftime(self.__format__ + ('.%06d' % value.microsecond))
+ return util.strftime(value, self.__format__ + ('.%06d' % value.microsecond))
else:
- return value.strftime(self.__format__)
+ return util.strftime(value, self.__format__)
else:
return None
return process
diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py
index af768ff36..18e4c6fa2 100644
--- a/lib/sqlalchemy/util.py
+++ b/lib/sqlalchemy/util.py
@@ -7,6 +7,7 @@
import inspect, itertools, new, operator, sets, sys, warnings, weakref
import __builtin__
types = __import__('types')
+import re
from sqlalchemy import exceptions
@@ -410,43 +411,31 @@ def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None,
exec py in env
setattr(into_cls, method, env[method])
-class SimpleProperty(object):
- """A *default* property accessor."""
-
- def __init__(self, key):
- self.key = key
-
- def __set__(self, obj, value):
- setattr(obj, self.key, value)
-
- def __delete__(self, obj):
- delattr(obj, self.key)
-
- def __get__(self, obj, owner):
- if obj is None:
- return self
- else:
- return getattr(obj, self.key)
-
-
-class NotImplProperty(object):
- """a property that raises ``NotImplementedError``."""
-
- def __init__(self, doc):
- self.__doc__ = doc
-
- def __set__(self, obj, value):
- raise NotImplementedError()
-
- def __delete__(self, obj):
- raise NotImplementedError()
-
- def __get__(self, obj, owner):
- if obj is None:
- return self
- else:
- raise NotImplementedError()
-
+_strftime_conversions = {
+ "Y":lambda dt: "%4.4d" % getattr(dt, 'year', 0),
+ "m":lambda dt: "%2.2d" % getattr(dt, 'month', 0),
+ "d":lambda dt: "%2.2d" % getattr(dt, 'day', 0),
+ "H":lambda dt: "%2.2d" % getattr(dt, 'hour', 0),
+ "M":lambda dt: "%2.2d" % getattr(dt, 'minute', 0),
+ "S":lambda dt: "%2.2d" % getattr(dt, 'second', 0),
+ "c":lambda dt: '%06d' % getattr(dt, 'microsecond', 0)
+}
+_strftime_regexp = re.compile(r'%(\w)')
+
+def strftime(dt, format):
+ """format a date, time or datetime object.
+
+ Partially compatible with datetime.strftime().
+
+ handles years before 1900.
+
+ Also adds "c", representing microseconds.
+
+ """
+ def repl(m):
+ return _strftime_conversions[m.group(1)](dt)
+ return _strftime_regexp.sub(repl, format)
+
class OrderedProperties(object):
"""An object that maintains the order in which attributes are set upon it.
diff --git a/test/sql/testtypes.py b/test/sql/testtypes.py
index 154e21bf9..35322a1e0 100644
--- a/test/sql/testtypes.py
+++ b/test/sql/testtypes.py
@@ -549,19 +549,19 @@ class DateTest(TestBase, AssertsExecutionResults):
if testing.against('oracle'):
import sqlalchemy.databases.oracle as oracle
insert_data = [
- [7, 'jack',
+ (7, 'jack',
datetime.datetime(2005, 11, 10, 0, 0),
datetime.date(2005,11,10),
- datetime.datetime(2005, 11, 10, 0, 0, 0, 29384)],
- [8, 'roy',
+ datetime.datetime(2005, 11, 10, 0, 0, 0, 29384)),
+ (8, 'roy',
datetime.datetime(2005, 11, 10, 11, 52, 35),
datetime.date(2005,10,10),
- datetime.datetime(2006, 5, 10, 15, 32, 47, 6754)],
- [9, 'foo',
+ datetime.datetime(2006, 5, 10, 15, 32, 47, 6754)),
+ (9, 'foo',
datetime.datetime(2006, 11, 10, 11, 52, 35),
datetime.date(1970,4,1),
- datetime.datetime(2004, 9, 18, 4, 0, 52, 1043)],
- [10, 'colber', None, None, None]
+ datetime.datetime(2004, 9, 18, 4, 0, 52, 1043)),
+ (10, 'colber', None, None, None),
]
fnames = ['user_id', 'user_name', 'user_datetime',
'user_date', 'user_time']
@@ -583,20 +583,22 @@ class DateTest(TestBase, AssertsExecutionResults):
time_micro = 0
insert_data = [
- [7, 'jack',
+ (7, 'jack',
datetime.datetime(2005, 11, 10, 0, 0),
datetime.date(2005, 11, 10),
- datetime.time(12, 20, 2)],
- [8, 'roy',
+ datetime.time(12, 20, 2)),
+ (8, 'roy',
datetime.datetime(2005, 11, 10, 11, 52, 35),
datetime.date(2005, 10, 10),
- datetime.time(0, 0, 0)],
- [9, 'foo',
+ datetime.time(0, 0, 0)),
+ (9, 'foo',
datetime.datetime(2005, 11, 10, 11, 52, 35, datetime_micro),
datetime.date(1970, 4, 1),
- datetime.time(23, 59, 59, time_micro)],
- [10, 'colber', None, None, None]
+ datetime.time(23, 59, 59, time_micro)),
+ (10, 'colber', None, None, None),
]
+
+
fnames = ['user_id', 'user_name', 'user_datetime',
'user_date', 'user_time']
@@ -606,6 +608,14 @@ class DateTest(TestBase, AssertsExecutionResults):
Column('user_date', Date),
Column('user_time', Time)]
+ if testing.against('sqlite', 'postgres'):
+ insert_data.append(
+ (11, 'historic',
+ datetime.datetime(1850, 11, 10, 11, 52, 35, datetime_micro),
+ datetime.date(1727,4,1),
+ None),
+ )
+
users_with_date = Table('query_users_with_date',
MetaData(testing.db), *collist)
users_with_date.create()
@@ -620,7 +630,7 @@ class DateTest(TestBase, AssertsExecutionResults):
def testdate(self):
global insert_data
- l = map(list, users_with_date.select().execute().fetchall())
+ l = map(tuple, users_with_date.select().execute().fetchall())
self.assert_(l == insert_data,
'DateTest mismatch: got:%s expected:%s' % (l, insert_data))