up their ".c." collection based on the names present in
the first selectable only; corresponding_column() now
works fully for all embedded selectables.
-
+
+ - Oracle and others properly encode SQL used for defaults
+ like sequences, etc., even if no unicode idents are used
+ since identifier preparer may return a cached unicode
+ identifier.
+
- orm
- Every Session.begin() must now be accompanied by a
corresponding commit() or rollback() unless the session
def visit_sequence(self, seq):
if not seq.optional:
- return self.execute_string(("select nextval('%s')" % self.dialect.identifier_preparer.format_sequence(seq)).encode(self.dialect.encoding))
+ return self.execute_string(("select nextval('%s')" % self.dialect.identifier_preparer.format_sequence(seq)))
else:
return None
"""execute a string statement, using the raw cursor,
and return a scalar result."""
conn = self.context._connection
+ if not self.dialect.supports_unicode_statements:
+ stmt = stmt.encode(self.dialect.encoding)
conn._cursor_execute(self.context.cursor, stmt, params)
return self.context.cursor.fetchone()[0]
from sqlalchemy import *
from testlib import *
from testlib.engines import utf8_engine
-
+from sqlalchemy.sql import column
class UnicodeSchemaTest(PersistTest):
@testing.unsupported('maxdb', 'oracle', 'sybase')
meta.drop_all()
metadata.create_all()
+ @testing.fails_on_everything_except('postgres', 'firebird', 'oracle')
+ def test_default_exec(self):
+ t1 = Table('t1', metadata,
+ Column(u'special_col', Integer, Sequence('special_col'), primary_key=True))
+ t1.create()
+
+ try:
+ engine = metadata.bind
+
+ # reset the identifier preparer, so that we can force it to cache
+ # a unicode identifier
+ engine.dialect.identifier_preparer = engine.dialect.preparer(engine.dialect)
+ select([column(u'special_col')]).select_from(t1).execute()
+ assert isinstance(engine.dialect.identifier_preparer.format_sequence(Sequence('special_col')), unicode)
+
+ # now execute, run the sequence. it should run in u"Special_col.nextid" or similar as
+ # a unicode object; cx_oracle asserts that this is None or a String (postgres lets it pass thru).
+ # ensure that base.DefaultRunner is encoding.
+ t1.insert().execute()
+ finally:
+ t1.drop()
if __name__ == '__main__':