2

当数据包含非 ascii 数据时,我在尝试通过 Bulbs 向 Neo4J 添加数据时遇到 Unicode 错误。

以下代码失败:

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 数据不被接受?我希望我只是错过了一些愚蠢的事情。

4

2 回答 2

1

在用 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 上尝试过这个,有人对此事有意见吗?

于 2013-11-07T23:53:17.613 回答
1

是的,这是一个错误。它在灯泡 0.3.23 中修复:

https://github.com/espeed/bulbs/commit/7f104cdbc30f27ea76b036cfa0d0a694f074153e

于 2013-11-11T12:24:51.737 回答