From 23525a3ea876f6ab16566c2dd0bbaa7ec1037052 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 17 Jun 2007 00:13:31 +0000 Subject: [PATCH] - datetime fixes: got subsecond TIMESTAMP to work [ticket:604], added OracleDate which supports types.Date with only year/month/day --- CHANGES | 4 +++ lib/sqlalchemy/databases/oracle.py | 16 ++++++++++-- test/sql/testtypes.py | 41 ++++++++++-------------------- 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/CHANGES b/CHANGES index ce3e86c2c0..1662d7624d 100644 --- a/CHANGES +++ b/CHANGES @@ -22,11 +22,15 @@ up ORM decision making [ticket:593] - mysql - added 'fields' to reserved words [ticket:590] +- oracle + - datetime fixes: got subsecond TIMESTAMP to work [ticket:604], + added OracleDate which supports types.Date with only year/month/day - sqlite - sqlite better handles datetime/date/time objects mixed and matched with various Date/Time/DateTime columns +>>>>>>> .r2741 0.3.8 - engines - added detach() to Connection, allows underlying DBAPI connection diff --git a/lib/sqlalchemy/databases/oracle.py b/lib/sqlalchemy/databases/oracle.py index 1cb4a0027a..55695e1ef6 100644 --- a/lib/sqlalchemy/databases/oracle.py +++ b/lib/sqlalchemy/databases/oracle.py @@ -11,6 +11,7 @@ from sqlalchemy import util, sql, engine, schema, ansisql, exceptions, logging from sqlalchemy.engine import default, base import sqlalchemy.types as sqltypes +import datetime class OracleNumeric(sqltypes.Numeric): @@ -28,6 +29,17 @@ class OracleSmallInteger(sqltypes.Smallinteger): def get_col_spec(self): return "SMALLINT" +class OracleDate(sqltypes.Date): + def get_col_spec(self): + return "DATE" + def convert_bind_param(self, value, dialect): + return value + def convert_result_value(self, value, dialect): + if not isinstance(value, datetime.datetime): + return value + else: + return value.date() + class OracleDateTime(sqltypes.DateTime): def get_col_spec(self): return "DATE" @@ -111,7 +123,7 @@ colspecs = { sqltypes.Numeric : OracleNumeric, sqltypes.Float : OracleNumeric, sqltypes.DateTime : OracleDateTime, - sqltypes.Date : OracleDateTime, + sqltypes.Date : OracleDate, sqltypes.String : OracleString, sqltypes.Binary : OracleBinary, sqltypes.Boolean : OracleBoolean, @@ -122,7 +134,7 @@ colspecs = { ischema_names = { 'VARCHAR2' : OracleString, - 'DATE' : OracleDateTime, + 'DATE' : OracleDate, 'DATETIME' : OracleDateTime, 'NUMBER' : OracleNumeric, 'BLOB' : OracleBinary, diff --git a/test/sql/testtypes.py b/test/sql/testtypes.py index 3d4d4ecce6..4da3760d20 100644 --- a/test/sql/testtypes.py +++ b/test/sql/testtypes.py @@ -256,33 +256,18 @@ class DateTest(AssertMixin): global users_with_date, insert_data if db.engine.name == 'oracle': - # still trying to get oracle sub-second resolution to work - oracle_subsecond = False - if oracle_subsecond: - import sqlalchemy.databases.oracle as oracle - insert_data = [ - [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, 11, 52, 35), datetime.date(2005,10,10), datetime.datetime(2006, 5, 10, 15, 32, 47, 6754)], - [9, 'foo', datetime.datetime(2005, 11, 10, 11, 52, 35, 54839), datetime.date(1970,4,1), 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'] - - collist = [Column('user_id', INT, primary_key = True), Column('user_name', VARCHAR(20)), Column('user_datetime', DateTime), - Column('user_date', Date), Column('user_time', oracle.OracleTimestamp)] - else: - insert_data = [ - [7, 'jack', datetime.datetime(2005, 11, 10, 0, 0), datetime.datetime(2005, 11, 10, 0, 0, 0)], - [8, 'roy', datetime.datetime(2005, 11, 10, 11, 52, 35), datetime.datetime(2006, 5, 10, 15, 32, 47)], - [9, 'foo', datetime.datetime(2005, 11, 10, 11, 52, 35), datetime.datetime(2004, 9, 18, 4, 0, 52)], - [10, 'colber', None, None] - ] - - fnames = ['user_id', 'user_name', 'user_datetime', 'user_date', 'user_time'] - - collist = [Column('user_id', INT, primary_key = True), Column('user_name', VARCHAR(20)), Column('user_datetime', DateTime), - Column('user_date', DateTime)] + import sqlalchemy.databases.oracle as oracle + insert_data = [ + [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, 11, 52, 35), datetime.date(2005,10,10), 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] + ] + + fnames = ['user_id', 'user_name', 'user_datetime', 'user_date', 'user_time'] + + collist = [Column('user_id', INT, primary_key = True), Column('user_name', VARCHAR(20)), Column('user_datetime', DateTime), + Column('user_date', Date), Column('user_time', TIMESTAMP)] elif db.engine.name == 'mysql' or db.engine.name == 'mssql': # these dont really support the TIME type at all insert_data = [ @@ -336,7 +321,7 @@ class DateTest(AssertMixin): #print repr(x) def testdate2(self): - t = Table('testdate', testbase.metadata, Column('id', Integer, primary_key=True), + t = Table('testdate', testbase.metadata, Column('id', Integer, Sequence('datetest_id_seq', optional=True), primary_key=True), Column('adate', Date), Column('adatetime', DateTime)) t.create() try: -- 2.47.2