class OracleExecutionContext(default.DefaultExecutionContext):
def fire_sequence(self, seq):
- return self._execute_scalar("SELECT " +
+ return int(self._execute_scalar("SELECT " +
self.dialect.identifier_preparer.format_sequence(seq) +
- ".nextval FROM DUAL")
+ ".nextval FROM DUAL"))
class OracleDialect(default.DefaultDialect):
name = 'oracle'
if dialect.supports_native_decimal:
if self.asdecimal and self.scale is None:
processors.to_decimal_processor_factory(Decimal)
- elif not self.asdecimal:
+ elif not self.asdecimal and self.precision is None and self.scale is None:
return processors.to_float
else:
return None
# floats
return super(_OracleNumeric, self).\
result_processor(dialect, coltype)
-
+
class _OracleDate(sqltypes.Date):
def bind_processor(self, dialect):
return None
# convert all NUMBER with precision + positive scale to Decimal,
# or zero precision and 0 or neg scale, indicates "don't know",
# this effectively allows "native decimal" mode.
-
if defaultType == cx_Oracle.NUMBER \
and (
(precision and scale > 0) or \
def _expression_adaptations(self):
return {
operators.mul:{
- Interval:Interval
+ Interval:Interval,
+ Numeric:Numeric,
+ },
+ # Py2K
+ operators.div:{
+ Numeric:Numeric,
+ },
+ # end Py2K
+ operators.truediv:{
+ Numeric:Numeric,
+ },
+ operators.add:{
+ Numeric:Numeric,
},
+ operators.sub:{
+ Numeric:Numeric,
+ }
}
-
class Float(Numeric):
"""A type for ``float`` numbers.
else:
return None
+ @util.memoized_property
+ def _expression_adaptations(self):
+ return {
+ operators.mul:{
+ Interval:Interval,
+ Numeric:Float,
+ },
+ # Py2K
+ operators.div:{
+ Numeric:Float,
+ },
+ # end Py2K
+ operators.truediv:{
+ Numeric:Float,
+ },
+ operators.add:{
+ Numeric:Float,
+ },
+ operators.sub:{
+ Numeric:Float,
+ }
+ }
+
class DateTime(_DateAffinity, TypeEngine):
"""A type for ``datetime.datetime()`` objects.
seq = Sequence("My_Seq", schema="Some_Schema")
assert dialect.identifier_preparer.format_sequence(seq) == '"Some_Schema"."My_Seq"'
-
+
+
class ExecuteTest(TestBase):
__only_on__ = 'oracle'
testing.db.execute("/*+ this is a comment */ SELECT 1 FROM DUAL").fetchall(),
[(1,)]
)
-
+
+ def test_sequences_are_integers(self):
+ seq = Sequence('foo_seq')
+ seq.create(testing.db)
+ try:
+ val = testing.db.execute(seq)
+ eq_(val, 1)
+ assert type(val) is int
+ finally:
+ seq.drop(testing.db)
+
@testing.provide_metadata
def test_limit_offset_for_update(self):
# oracle can't actually do the ROWNUM thing with FOR UPDATE
})
session = create_session()
- session.add(User(name='joe', tags=[Tag(score1=5.0, score2=3.0), Tag(score1=55.0, score2=1.0)]))
- session.add(User(name='bar', tags=[Tag(score1=5.0, score2=4.0), Tag(score1=50.0, score2=1.0), Tag(score1=15.0, score2=2.0)]))
+ session.add(User(name='joe', tags=[Tag(score1=5.0, score2=3.0),
+ Tag(score1=55.0, score2=1.0)]))
+ session.add(User(name='bar', tags=[Tag(score1=5.0, score2=4.0),
+ Tag(score1=50.0, score2=1.0),
+ Tag(score1=15.0, score2=2.0)]))
session.flush()
session.expunge_all()