Thank you Michael for your answers, but
This does not work even with the UFT-8 encoding.
I changed my program with utf-8:
=====================================================
# -*- coding: utf-8 -*-
from elixir import *
from sqlalchemy import create_engine
class TestEnum(Entity):
using_options(tablename='TEST_ENUM')
myEnum = Field(Unicode(100),\
Enum('avec é',
u'avec è',
u'avec à'),\
colname='MY_ENUM')
if __name__ == '__main__':
metadata.bind = create_engine('oracle://..:..@..',
encoding='utf-8', echo=True)
x = u'avec é'
print '=' * 20
print x.encode('utf-8')
print '=' * 20
setup_all()
drop_all()
create_all()
test = TestEnum()
test.id = 1
test.myEnum = u'avec é'
session.commit()
The execution log :
=====================================================
====================
avec é
====================
2012-01-17 07:10:03,375 INFO sqlalchemy.engine.base.Engine SELECT USER
FROM DUAL
2012-01-17 07:10:03,375 INFO sqlalchemy.engine.base.Engine {}
2012-01-17 07:10:03,375 INFO sqlalchemy.engine.base.Engine SELECT
table_name FROM all_tables WHERE table_name = :name AND owner
= :schema_name
2012-01-17 07:10:03,375 INFO sqlalchemy.engine.base.Engine {'name':
u'TEST_ENUM', 'schema_name': u'PBOSSE'}
2012-01-17 07:10:03,375 INFO sqlalchemy.engine.base.Engine
DROP TABLE "TEST_ENUM"
2012-01-17 07:10:03,375 INFO sqlalchemy.engine.base.Engine {}
2012-01-17 07:10:03,391 INFO sqlalchemy.engine.base.Engine COMMIT
2012-01-17 07:10:03,405 INFO sqlalchemy.engine.base.Engine SELECT
table_name FROM all_tables WHERE table_name = :name AND owner
= :schema_name
2012-01-17 07:10:03,405 INFO sqlalchemy.engine.base.Engine {'name':
u'TEST_ENUM', 'schema_name': u'PBOSSE'}
2012-01-17 07:10:03,405 INFO sqlalchemy.engine.base.Engine
CREATE TABLE "TEST_ENUM" (
id INTEGER NOT NULL,
"MY_ENUM" NVARCHAR2(100),
PRIMARY KEY (id),
CHECK ("MY_ENUM" IN ('avec é', 'avec è', 'avec à'))
)
2012-01-17 07:10:03,405 INFO sqlalchemy.engine.base.Engine {}
2012-01-17 07:10:03,453 INFO sqlalchemy.engine.base.Engine COMMIT
2012-01-17 07:10:03,453 INFO sqlalchemy.engine.base.Engine BEGIN
(implicit)
2012-01-17 07:10:03,453 INFO sqlalchemy.engine.base.Engine INSERT INTO
"TEST_ENUM" (id, "MY_ENUM") VALUES (:id, :MY_ENUM)
2012-01-17 07:10:03,453 INFO sqlalchemy.engine.base.Engine {'MY_ENUM':
u'avec \xe9', 'id': 1}
2012-01-17 07:10:03,453 INFO sqlalchemy.engine.base.Engine ROLLBACK
Traceback (most recent call last):
File "E:\Data\!RefVec\dev\workspace\BdrsMD_Metadata\bdrs\models
\TestEnum.py", line 38, in <module>
session.commit()
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\orm\scoping.py", line 113, in do
return getattr(self.registry(), name)(*args, **kwargs)
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\orm\session.py", line 645, in commit
self.transaction.commit()
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\orm\session.py", line 313, in commit
self._prepare_impl()
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\orm\session.py", line 297, in _prepare_impl
self.session.flush()
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\orm\session.py", line 1547, in flush
self._flush(objects)
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\orm\session.py", line 1616, in _flush
flush_context.execute()
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\orm\unitofwork.py", line 328, in execute
rec.execute(self)
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\orm\unitofwork.py", line 472, in execute
uow
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\orm\mapper.py", line 2193, in _save_obj
execute(statement, multiparams)
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\engine\base.py", line 1399, in execute
params)
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\engine\base.py", line 1532, in
_execute_clauseelement
compiled_sql, distilled_params
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\engine\base.py", line 1640, in _execute_context
context)
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\engine\base.py", line 1633, in _execute_context
context)
File "C:\Program Files\Python27\lib\site-packages\sqlalchemy-0.7.3-
py2.7.egg\sqlalchemy\engine\default.py", line 330, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.IntegrityError: (IntegrityError) ORA-02290: check
constraint (PBOSSE.SYS_C0017639) violated
'INSERT INTO "TEST_ENUM" (id, "MY_ENUM") VALUES
(:id, :MY_ENUM)' {'MY_ENUM': u'avec \xe9', 'id': 1}
The contraint in the Oracle DB is recorded as follows:
"MY_ENUM" IN ('avec é', 'avec è', 'avec à ')
It is normal that it does not work.
=====================================================
If I do not add value domain constraint (Enum), adding to the database
and is non-ACII are preserved.
The program without Enum :
=====================================================
# -*- coding: utf-8 -*-
from elixir import *
from sqlalchemy import create_engine
class TestEnum(Entity):
using_options(tablename='TEST_ENUM')
# myEnum = Field(Unicode(100),\
# Enum('avec é',
# u'avec è',
# u'avec à'),\
# colname='MY_ENUM')
myEnum = Field(Unicode(100), colname='MY_ENUM')
if __name__ == '__main__':
metadata.bind = create_engine('oracle://..:..@..',
encoding='utf-8', echo=True)
x = u'avec é'
print '=' * 20
print x.encode('utf-8')
print '=' * 20
setup_all()
drop_all()
create_all()
test1 = TestEnum()
test1.id = 1
test1.myEnum = u'avec é'
session.commit()
test2 = TestEnum.query.filter(TestEnum.myEnum == u'avec é').all()
print '=' * 20
print test2[0].myEnum
print '=' * 20
The execution log :
=====================================================
====================
avec é
====================
2012-01-17 07:37:54,536 INFO sqlalchemy.engine.base.Engine SELECT USER
FROM DUAL
2012-01-17 07:37:54,536 INFO sqlalchemy.engine.base.Engine {}
2012-01-17 07:37:54,536 INFO sqlalchemy.engine.base.Engine SELECT
table_name FROM all_tables WHERE table_name = :name AND owner
= :schema_name
2012-01-17 07:37:54,536 INFO sqlalchemy.engine.base.Engine {'name':
u'TEST_ENUM', 'schema_name': u'PBOSSE'}
2012-01-17 07:37:54,552 INFO sqlalchemy.engine.base.Engine
DROP TABLE "TEST_ENUM"
2012-01-17 07:37:54,552 INFO sqlalchemy.engine.base.Engine {}
2012-01-17 07:37:54,568 INFO sqlalchemy.engine.base.Engine COMMIT
2012-01-17 07:37:54,568 INFO sqlalchemy.engine.base.Engine SELECT
table_name FROM all_tables WHERE table_name = :name AND owner
= :schema_name
2012-01-17 07:37:54,568 INFO sqlalchemy.engine.base.Engine {'name':
u'TEST_ENUM', 'schema_name': u'PBOSSE'}
2012-01-17 07:37:54,568 INFO sqlalchemy.engine.base.Engine
CREATE TABLE "TEST_ENUM" (
id INTEGER NOT NULL,
"MY_ENUM" NVARCHAR2(100),
PRIMARY KEY (id)
)
2012-01-17 07:37:54,568 INFO sqlalchemy.engine.base.Engine {}
2012-01-17 07:37:54,818 INFO sqlalchemy.engine.base.Engine COMMIT
2012-01-17 07:37:54,832 INFO sqlalchemy.engine.base.Engine BEGIN
(implicit)
2012-01-17 07:37:54,832 INFO sqlalchemy.engine.base.Engine INSERT INTO
"TEST_ENUM" (id, "MY_ENUM") VALUES (:id, :MY_ENUM)
2012-01-17 07:37:54,832 INFO sqlalchemy.engine.base.Engine {'MY_ENUM':
u'avec \xe9', 'id': 1}
2012-01-17 07:37:54,832 INFO sqlalchemy.engine.base.Engine COMMIT
2012-01-17 07:37:54,832 INFO sqlalchemy.engine.base.Engine BEGIN
(implicit)
2012-01-17 07:37:54,832 INFO sqlalchemy.engine.base.Engine SELECT
"TEST_ENUM".id AS "TEST_ENUM_id", "TEST_ENUM"."MY_ENUM" AS
"TEST_ENUM_MY_ENUM"
FROM "TEST_ENUM"
WHERE "TEST_ENUM"."MY_ENUM" = :MY_ENUM_1
2012-01-17 07:37:54,832 INFO sqlalchemy.engine.base.Engine
{'MY_ENUM_1': u'avec \xe9'}
====================
avec é
====================
=====================================================
What happens with Enum??
--
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.