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 [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.