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, у кого-то есть что-то интересное?

Другие вопросы по тегам