From: Mike Bayer Date: Tue, 3 Oct 2006 21:47:48 +0000 (+0000) Subject: - added auto_setinputsizes=False to oracle dialect. if true, all executions will... X-Git-Tag: rel_0_3_0~91 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=73f145dc0e725d8aa7eb47429a89fbc448f97414;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - added auto_setinputsizes=False to oracle dialect. if true, all executions will get setinputsizes called ahead of time. - some tweaks to the types unittest for oracle. oracle types still need lots more work. --- diff --git a/lib/sqlalchemy/databases/oracle.py b/lib/sqlalchemy/databases/oracle.py index 620a5abd61..db82e3dea8 100644 --- a/lib/sqlalchemy/databases/oracle.py +++ b/lib/sqlalchemy/databases/oracle.py @@ -132,10 +132,11 @@ def descriptor(): class OracleExecutionContext(default.DefaultExecutionContext): def pre_exec(self, engine, proxy, compiled, parameters): super(OracleExecutionContext, self).pre_exec(engine, proxy, compiled, parameters) - #self.set_input_sizes(proxy(), parameters) + if self.dialect.auto_setinputsizes: + self.set_input_sizes(proxy(), parameters) class OracleDialect(ansisql.ANSIDialect): - def __init__(self, use_ansi=True, module=None, threaded=True, **kwargs): + def __init__(self, use_ansi=True, auto_setinputsizes=False, module=None, threaded=True, **kwargs): self.use_ansi = use_ansi self.threaded = threaded if module is None: @@ -143,6 +144,7 @@ class OracleDialect(ansisql.ANSIDialect): else: self.module = module self.supports_timestamp = hasattr(self.module, 'TIMESTAMP' ) + self.auto_setinputsizes = auto_setinputsizes ansisql.ANSIDialect.__init__(self, **kwargs) def dbapi(self): diff --git a/lib/sqlalchemy/engine/default.py b/lib/sqlalchemy/engine/default.py index 4a3791c35b..ea542fe5b7 100644 --- a/lib/sqlalchemy/engine/default.py +++ b/lib/sqlalchemy/engine/default.py @@ -174,14 +174,14 @@ class DefaultExecutionContext(base.ExecutionContext): plist = [parameters] if self.dialect.positional: inputsizes = [] - for params in plist[0]: + for params in plist[0:1]: for key in params.positional: typeengine = params.binds[key].type inputsizes.append(typeengine.get_dbapi_type(self.dialect.module)) cursor.setinputsizes(*inputsizes) else: inputsizes = {} - for params in plist[0]: + for params in plist[0:1]: for key in params.keys(): typeengine = params.binds[key].type inputsizes[key] = typeengine.get_dbapi_type(self.dialect.module) diff --git a/test/sql/testtypes.py b/test/sql/testtypes.py index 524834fec5..04602ebf5c 100644 --- a/test/sql/testtypes.py +++ b/test/sql/testtypes.py @@ -182,6 +182,8 @@ class BinaryTest(AssertMixin): binary_table.create() def tearDownAll(self): binary_table.drop() + + @testbase.unsupported('oracle') def testbinary(self): testobj1 = pickleable.Foo('im foo 1') testobj2 = pickleable.Foo('im foo 2') @@ -211,34 +213,58 @@ class DateTest(AssertMixin): def setUpAll(self): global users_with_date, insert_data - insert_data = [ + if db.engine.name == 'oracle': + 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)] + elif db.engine.name == 'mysql' or db.engine.name == 'mssql': + insert_data = [ [7, 'jack', datetime.datetime(2005, 11, 10, 0, 0), datetime.date(2005,11,10), 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.datetime(2005, 11, 10, 11, 52, 35, 54839), datetime.date(1970,4,1), datetime.time(23,59,59,999)], + [9, 'foo', datetime.datetime(2005, 11, 10, 11, 52, 35), datetime.date(1970,4,1), datetime.time(23,59,59,999)], [10, 'colber', None, None, None] - ] + ] - fnames = ['user_id', 'user_name', 'user_datetime', 'user_date', 'user_time'] + 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(timezone=False)), + collist = [Column('user_id', INT, primary_key = True), Column('user_name', VARCHAR(20)), Column('user_datetime', DateTime(timezone=False)), Column('user_date', Date), Column('user_time', Time)] - - if db.engine.name == 'mysql' or db.engine.name == 'mssql': - # strip microseconds -- not supported by this engine (should be an easier way to detect this) - for d in insert_data: - if d[2] is not None: - d[2] = d[2].replace(microsecond=0) - if d[4] is not None: - d[4] = d[4].replace(microsecond=0) - - try: - db.type_descriptor(types.TIME).get_col_spec() - except: - # don't test TIME type -- not supported by this engine - insert_data = [d[:-1] for d in insert_data] - fnames = fnames[:-1] - collist = collist[:-1] + else: + insert_data = [ + [7, 'jack', datetime.datetime(2005, 11, 10, 0, 0), datetime.date(2005,11,10), 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.datetime(2005, 11, 10, 11, 52, 35, 54839), datetime.date(1970,4,1), datetime.time(23,59,59,999)], + [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(timezone=False)), + Column('user_date', Date), Column('user_time', Time)] + users_with_date = Table('query_users_with_date', db, redefine = True, *collist) users_with_date.create() insert_dicts = [dict(zip(fnames, d)) for d in insert_data] @@ -270,6 +296,7 @@ class TimezoneTest(AssertMixin): if postgres returns it. python then will not let you compare a datetime with a tzinfo to a datetime that doesnt have one. this test illustrates two ways to have datetime types with and without timezone info. """ + @testbase.supported('postgres') def setUpAll(self): global tztable, notztable, metadata metadata = BoundMetaData(testbase.db) @@ -286,6 +313,7 @@ class TimezoneTest(AssertMixin): Column("name", String(20)), ) metadata.create_all() + @testbase.supported('postgres') def tearDownAll(self): metadata.drop_all()