3

コード:

>>> from django.core import serializers
>>> objects = serializers.deserialize('xml', fixturestr.encode('utf8'))
>>> o = next(objects)
>>> o
<DeserializedObject: countries.Country(pk=AF)>
>>> type(o)
<class 'django.core.serializers.base.DeserializedObject'>
>>> dir(o)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm2m_data', 'object', 'save']
>>> o.save()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/marcintustin/oneclickrep/oneclickcosvirt/lib/python2.7/site-packages/django/core/serializers/base.py", line 165, in save
    models.Model.save_base(self.object, using=using, raw=True)
  File "/home/marcintustin/oneclickrep/oneclickcosvirt/lib/python2.7/site-packages/django/db/models/base.py", line 524, in save_base
    manager.using(using).filter(pk=pk_val).exists())):
  File "/home/marcintustin/oneclickrep/oneclickcosvirt/lib/python2.7/site-packages/django/db/models/query.py", line 562, in exists
    return self.query.has_results(using=self.db)
  File "/home/marcintustin/oneclickrep/oneclickcosvirt/lib/python2.7/site-packages/django/db/models/sql/query.py", line 441, in has_results
    return bool(compiler.execute_sql(SINGLE))
  File "/home/marcintustin/oneclickrep/oneclickcosvirt/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 818, in execute_sql
    cursor.execute(sql, params)
  File "/home/marcintustin/oneclickrep/oneclickcosvirt/lib/python2.7/site-packages/django/db/backends/util.py", line 40, in execute
    return self.cursor.execute(sql, params)
  File "/home/marcintustin/oneclickrep/oneclickcosvirt/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 337, in execute
    return Database.Cursor.execute(self, query, params)
DatabaseError: near "����������������������������������������������������������������������������������������������������1": syntax error

クエリとパラメーター:

(Pdb) query
u'SELECT (1) AS "a" FROM "country" WHERE "country"."iso" = ?  LIMIT 1'
(Pdb) params
(u'AF',)

正直なところ、私は困惑しています - 私はこれをどこに行けばいいのかさえわかりません. クエリは、提示された恐怖ほど長くすべきではありません。エラー メッセージも utf-8 としてデコードされません。

基礎となるタスクは、xml フィクスチャを読み込み、それをデータベースにプッシュすることです。残念ながら、標準loaddataコマンドは utf-8 xml の非 ASCII 文字を処理できません (興味がある場合は、私の他の最近の質問を参照してください)。loaddataそのため、デシリアライザーのutf-8でエンコードされたバイトを渡すことができるように、手動で何をしようとしています。

Linuxでdjango 1.4でpython 2.7.5を実行しています。

この問題を完全に回避する方法、またはそれを解決する方法やさらに診断する方法についてのヒントに感謝します。

更新: これは、クエリを手動で試行した結果です。

>>> import sqlite3
>>> conn = sqlite3.connect('database.sqlite3.db')
>>> c = conn.cursor()
>>> c.execute(u'SELECT (1) AS "a" FROM "country" WHERE "country"."iso" = ?  LIMIT 1', (u'AF',))
Traceback (most recent call last):
  File "<console>", line 1, in <module>
OperationalError: near "����������������������������������������������������������������������������������������������������1": syntax error
>>> c.execute(u'SELECT (1) AS "a" FROM "country" WHERE "country"."iso" = AF  LIMIT 1')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
OperationalError: near "����������������������������������������������������������������������������������������������������": syntax error
>>> c.execute(u'SELECT * from "country" WHERE "country"."iso" = AF  LIMIT 1')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
OperationalError: near "��������������������������������������������������������������������������������������������1����": syntax error
>>> c.execute(u'SELECT * from "country"')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
OperationalError: near "������������������������������������": syntax error
>>> c.execute('SELECT * from "country"')
<sqlite3.Cursor object at 0x4123f10>
>>> 

私の端末はutf-8を使用するように設定されています。Unicode オブジェクトを渡すことがなぜこれほどひどく間違っているのかは明らかではありません。

更新 2: これは sqlite のバージョン情報です。

>>> sqlite3.version_info
(2, 6, 0)
>>> sqlite3.sqlite_version_info
(3, 7, 11)
>>> sqlite3.sqlite_version
'3.7.11'
>>> sqlite3.x
'11'
>>>

更新 3: Unicode 文字列を使用しようとすると、データベース内のすべてのテーブルで同じエラーが発生します。

更新 4: 同じエラーが新しいデータベースに影響します。python docs からサンプル コードを実行し、Unicode クエリを実行しようとした結果は次のとおりです。

>>> conn.close()
>>> conn = sqlite3.connect('example.db')
>>> c = conn.cursor()
>>> 
>>> # Create table
>>> c.execute('''CREATE TABLE stocks
...              (date text, trans text, symbol text, qty real, price real)''')
<sqlite3.Cursor object at 0x43e9180>
>>> 
>>> # Insert a row of data
>>> c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
<sqlite3.Cursor object at 0x43e9180>
>>> 
>>> # Save (commit) the changes
>>> conn.commit()
>>> c.execute(u'SELECT * FROM "stocks"')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
OperationalError: near "����������������������������": syntax error
>>> 

更新 5: sqlite ライブラリを提供するパッケージはsqlite-3.7.11-3.fc17.x86_64.

4

1 に答える 1