UnicodeEncodeError: лампочки и neo4j создают модель
Я получаю ошибки Unicode при попытке добавить данные в Neo4J через Bulbs, когда данные содержат данные, отличные от ascii.
следующий код не работает:
from bulbs.model import Node
from bulbs.property import String
from bulbs.neo4jserver import Graph
class User(Node):
element_type="user"
name = String(nullable=False)
g = Graph()
g.add_proxy("users", User)
user_data = {u'name': u'Aname M\xf6ller'}
g.users.create(**user_data)
с UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 7: ordinal not in range(128)
Ошибка происходит в bulbs.utils.u
функция через codecs.unicode_escape_decode()
,
Некоторая, надеюсь, актуальная информация:
$>python -V
'2.7.3'
>>>type(user_data['name'])
type('unicode')
>>>import bulbs
>>>bulbs.__version__
'0.3'
Документы Neo4J утверждают, что все объекты String сохраняются как Unicode, так почему мои данные Unicode не принимаются? Я надеюсь, что я просто упускаю что-то глупое.
2 ответа
Да, это была ошибка. Это исправлено в луковицах 0.3.23:
https://github.com/espeed/bulbs/commit/7f104cdbc30f27ea76b036cfa0d0a694f074153e
После обновления на Python и Unicode я обошел проблему, но только обернув мою проблемную строку в try, catch, а затем закодировал проблемные данные в 'utf-8'. Не самое элегантное решение, но мне кажется, что следующий код работает.
from bulbs.model import Node
from bulbs.property import String
from bulbs.neo4jserver import Graph
class User(Node):
element_type="user"
name = String(nullable=False)
g = Graph()
g.add_proxy("users", User)
user_data = {u'name': u'Aname M\xf6ller'}
try:
g.users.create(**user_data)
except UnicodeEncodeError:
for k, v in user_data.iteritems():
try:
user_data[k] = unicode.encode(v, 'utf-8')
except TypeError:
# Fails for non string values
pass
g.users.create(**user_data)
Единственная проблема, которую я имею с этим. Если bulbs
регистратор активен, затем сообщение об ошибке с трассировкой регистрируется при первом вызове create()
, Не прерыватель сделки, просто немного раздражает.
Не пробовали это на Python 3, у кого-то есть что-то интересное?