在数据库查询中使用unicode表示python词典

时间:2015-05-22 15:38:30

标签: python unicode orientdb

我有一个问题,我想知道如何有效地解决。

我有JSON格式的数据(与转储/加载一起使用)并包含unicode。

这是使用JSON实现发送消息的协议的一部分。因此消息将作为字符串发送,然后加载到python词典中。这意味着表示,作为python字典,之后将看起来像:

{u" mykey":你" myVal"}

系统处理这样的结构本身没有问题,但是当我要进行数据库查询来存储这个结构时就会发生这种情况。

我使用pyOrient对OrientDB。该命令最终结果如下:

"CREATE VERTEX TestVertex SET data = {u'mykey': u'myVal'}"

最终将在数据字段中获取OrientDB中的以下值:

{'_NOT_PARSED_': '_NOT_PARSED_'}

我假设当您希望进行查询或以某种方式表示包含unicode的数据对象时,此问题与其他情况有关。

如何有效地获取任意深度的数据表示,以便能够在查询中使用它?

为了澄清更多,这是db期望的字符串:

"CREATE VERTEX TestVertex SET data = {'mykey': 'myVal'}"

如果我只是陈述错误的问题/问题而应该以其他方式处理,我非常愿意接受建议。但我想要实现的是有一种有效的方法来使用 python2.7 来构建指向任意数据结构的orientdb(使用pyorient)的db-query。正在设置的data属性是OrientDB类型EMBEDDEDMAP。

非常感谢任何帮助。

EDIT1:

更明确地说明第一个代码块在转储/加载json之后将对象显示为dict以避免混淆。

2 个答案:

答案 0 :(得分:0)

Dargolith:

根据您的上一个响应,您似乎只是在寻找能够控制unicode和其他数据类型打印方式的转码python表达式的代码。这是一个提供此控件的非常简单的功能。有一些方法可以使这个函数更有效(例如,通过使用字符串缓冲区而不是执行此处发生的所有递归字符串连接)。这仍然是一个非常简单的功能,并且它的执行可能仍然由您的数据库查找主导。

正如您在每个'if'语句中所看到的,您可以完全控制每种数据类型的打印方式。

def expr_to_str(thing):
    if hasattr(thing, 'keys'):
        pairs = ['%s:%s' % (expr_to_str(k),expr_to_str(v)) for k,v in thing.iteritems()]
        return '{%s}' % ', '.join(pairs)
    if hasattr(thing, '__setslice__'):
        parts = [expr_to_str(ele) for ele in thing]
        return '[%s]' % (', '.join(parts),)
    if isinstance(thing, basestring):
        return "'%s'" % (str(thing),)
    return str(thing)



print "dumped: %s" % expr_to_str({'one': 33, 'two': [u'unicode', 'just a str', 44.44, {'hash': 'here'}]})

输出:

dumped: {'two':['unicode', 'just a str', 44.44, {'hash':'here'}], 'one':33}

答案 1 :(得分:0)

我继续使用json.dumps()作为评论中建议的sobolevn。我起初并没有想到那个,因为我在驱动程序中并没有真正使用json。然而事实证明,json.dumps()提供了我所使用的所有数据类型所需的格式。一些例子:

>>> json.dumps('test')
'"test"'
>>> json.dumps(['test1', 'test2'])
'["test1", "test2"]'
>>> json.dumps([u'test1', u'test2'])
'["test1", "test2"]'
>>> json.dumps({u'key1': u'val1', u'key2': [u'val21', 'val22', 1]})
'{"key2": ["val21", "val22", 1], "key1": "val1"}'

如果您需要更多地控制有关此转换的格式,引号或其他内容,请参阅Dan Oblinger的回复。