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.

Reply via email to