小田切です。
http://d.hatena.ne.jp/aodag でBlog作成のサンプルコードを書いています。
その中で、UnicodeColを使用中に不思議な現象に会いました。
class Comment(SQLObject):
date = DateCol()
data = UnicodeCol(default=None)
author = UnicodeCol(default=None)
blog = ForeignKey("Blog")
上記モデルに対して、以下のコードでモデル作成をするとエラーになります。
エラー発生時のdata, authorの内容が日本語の場合です。
アルファベットなどの場合はエラーになりませんでした。
hub.begin()
try:
c = Comment(date=date.today(), blogID=blogId, data=data,.
author=author)
hub.commit()
except:
hub.rollback()
raise
hub.end()
エラー時のtracebackは以下のとおりです。
Traceback (most recent call last):
File
"c:\python24\lib\site-packages\CherryPy-2.2.1-py2.4.egg\cherrypy\_cphttptools.py",
line 105, in _run
self.main()
File
"c:\python24\lib\site-packages\CherryPy-2.2.1-py2.4.egg\cherrypy\_cphttptools.py",
line 254, in main
body = page_handler(*virtual_path, **self.params)
File "<string>", line 3, in addComment
File
"c:\python24\lib\site-packages\TurboGears-0.9a6-py2.4.egg\turbogears\controllers.py",
line 273, in expose
output = database.run_with_transaction(
File
"c:\python24\lib\site-packages\TurboGears-0.9a6-py2.4.egg\turbogears\database.py",
line 221, in run_with_transaction
retval = func(*args, **kw)
File "<string>", line 5, in _expose
File
"c:\python24\lib\site-packages\TurboGears-0.9a6-py2.4.egg\turbogears\controllers.py",
line 290, in <lambda>
mapping, fragment, *args, **kw)))
File
"c:\python24\lib\site-packages\TurboGears-0.9a6-py2.4.egg\turbogears\controllers.py",
line 314, in _execute_func
output = errorhandling.try_call(func, *args, **kw)
File
"c:\python24\lib\site-packages\TurboGears-0.9a6-py2.4.egg\turbogears\errorhandling.py",
line 71, in try_call
return func(self, *args, **kw)
File "C:\works\blog\blog\controllers.py", line 94, in addComment
c = Comment(date=date.today(), blogID=blogId, data=data, author=author)
File
"c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\main.py",
line 1197, in __init__
self._create(id, **kw)
File
"c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\main.py",
line 1224, in _create
self._SO_finishCreate(id)
File
"c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\main.py",
line 1248, in _SO_finishCreate
id, names, values)
File
"c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\dbconnection.py",
line 752, in queryInsertID
return self._dbConnection._queryInsertID(
File
"c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\sqlite\sqliteconnection.py",
line 103, in _queryInsertID
q = self._insertSQL(table, names, values)
File
"c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\sqlite\sqliteconnection.py",
line 121, in _insertSQL
return DBAPI._insertSQL(self, table, names, values)
File
"c:\python24\lib\site-packages\SQLObject-0.7.1dev_r1457-py2.4.egg\sqlobject\dbconnection.py",
line 349, in _insertSQL
return ("INSERT INTO %s (%s) VALUES (%s)" %
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position
1: ordinal not in range(128)
エラー内容からするとasciiコードへの変換をしてしまっているようです。
この動作によって、日本語を使用するとエラーになることはわかりますが、なぜこの動作をするのかがわかりません。
以下のようにするとエラーになりません。
hub.begin()
try:
c = Comment(date=date.today(), blogID=blogId)
c.data=data
c.author=author
hub.commit()
except:
hub.rollback()
raise
hub.end()
INSERT文生成時に日本語が入っていなければエラーとならないのですが、
Commentクラス以外のUnicodeColを使用したモデルではこのような現象が発生していません。
UnicodeCol使用にあたって設定する部分があるのでしょうか。
--
/*
Atsushi Odagiri
mailto:[EMAIL PROTECTED]
*/
--~--~---------~--~----~------------~-------~--~----~
これは、お客様が次の Google グループに申し込まれたことを確認するメッセー
ジです。 Google Groups "turbogears-ja" group.
To post to this group, send email to [email protected]
このグループから退会するには、次へメールをお送りください。 [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/turbogears-ja
-~----------~----~----~----~------~----~------~--~---