小田切です。

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
-~----------~----~----~----~------~----~------~--~---

メールによる返信