On Jan 17, 2012, at 12:29 PM, Michael Bayer wrote: > > OK but very significantly, the behavior has changed. SQLAlchemy is now > sending in the correct DDL to Oracle. What remains is whether or not it > gets to cx_oracle in the best way possible as well as if cx_oracle does the > right thing with it. We've had a very hard time getting cx_oracle/Oracle to > understand fully unicode DDL expressions and it doesn't work completely. > > At the very least you need to be on a recent cx_Oracle, 5.1 or later, and you > need to ensure your NLS_LANG environment variable is set, such as > NLS_LANG=AMERICAN.AMERICA.UTF8 though I guess you might need to adjust that > for your locale. > > Try that and I'll see if we can maybe make some more adjustments to the > dialect for the most recent cx_Oracle versions, I notice that we're still > encoding the DDL before we pass to cx_Oracle so maybe we can improve on that.
It's all working for me: NLS_LANG=AMERICAN_AMERICA.UTF8 cx_Oracle 5.1.1 script, tests creating the constraint, inserting, selecting, matching on the column: # -*- coding: utf-8 -*- from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base Base= declarative_base() class Foo(Base): __tablename__ = 'foo' id = Column(Integer, primary_key=True) value = Column(Unicode(100), Enum(u'avec é', u'avec è', u'avec à') ) e = create_engine("oracle://scott:tiger@/xe", echo=True) Base.metadata.drop_all(e) Base.metadata.create_all(e) s = Session(e) s.add(Foo(id=1, value=u'avec è')) s.commit() s.close() f = s.query(Foo).filter(Foo.value==u'avec è').first() assert f.value == u'avec è' output: 2012-01-17 17:55:49,916 INFO sqlalchemy.engine.base.Engine SELECT USER FROM DUAL 2012-01-17 17:55:49,917 INFO sqlalchemy.engine.base.Engine {} 2012-01-17 17:55:49,922 INFO sqlalchemy.engine.base.Engine SELECT table_name FROM all_tables WHERE table_name = :name AND owner = :schema_name 2012-01-17 17:55:49,922 INFO sqlalchemy.engine.base.Engine {'name': u'FOO', 'schema_name': u'SCOTT'} 2012-01-17 17:55:49,928 INFO sqlalchemy.engine.base.Engine DROP TABLE foo 2012-01-17 17:55:49,928 INFO sqlalchemy.engine.base.Engine {} 2012-01-17 17:55:49,963 INFO sqlalchemy.engine.base.Engine COMMIT 2012-01-17 17:55:49,965 INFO sqlalchemy.engine.base.Engine SELECT table_name FROM all_tables WHERE table_name = :name AND owner = :schema_name 2012-01-17 17:55:49,965 INFO sqlalchemy.engine.base.Engine {'name': u'FOO', 'schema_name': u'SCOTT'} 2012-01-17 17:55:49,970 INFO sqlalchemy.engine.base.Engine CREATE TABLE foo ( id INTEGER NOT NULL, value NVARCHAR2(100), PRIMARY KEY (id), CHECK (value IN ('avec é', 'avec è', 'avec à')) ) 2012-01-17 17:55:49,970 INFO sqlalchemy.engine.base.Engine {} 2012-01-17 17:55:50,131 INFO sqlalchemy.engine.base.Engine COMMIT 2012-01-17 17:55:50,133 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 2012-01-17 17:55:50,134 INFO sqlalchemy.engine.base.Engine INSERT INTO foo (id, value) VALUES (:id, :value) 2012-01-17 17:55:50,134 INFO sqlalchemy.engine.base.Engine {'id': 1, 'value': u'avec \xe8'} 2012-01-17 17:55:50,137 INFO sqlalchemy.engine.base.Engine COMMIT 2012-01-17 17:55:50,139 INFO sqlalchemy.engine.base.Engine BEGIN (implicit) 2012-01-17 17:55:50,141 INFO sqlalchemy.engine.base.Engine SELECT foo_id, foo_value FROM (SELECT foo.id AS foo_id, foo.value AS foo_value FROM foo WHERE foo.value = :value_1) WHERE ROWNUM <= :ROWNUM_1 2012-01-17 17:55:50,141 INFO sqlalchemy.engine.base.Engine {'ROWNUM_1': 1, 'value_1': u'avec \xe8'} -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.