在数据库查询中用 unicode 表示 python 个字典

Representation of python dictionaries with unicode in database queries

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

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

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

{u"mykey":u"myVal"}

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

我在 OrientDB 上使用 pyOrient。该命令的结尾类似于:

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

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

{'_NOT_PARSED_': '_NOT_PARSED_'}

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

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

为了进一步说明,这是数据库期望的字符串:

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

如果我只是陈述错误 problem/question 并且应该以其他方式处理它,我非常愿意接受建议。但我想要实现的是有一种有效的方法来使用 python2.7 构建一个指向 orientdb(使用 pyorient)的数据库查询,它指定一个任意数据结构。正在设置的数据 属性 是 OrientDB 类型的 EMBEDDEDMAP。

非常感谢任何帮助。

编辑1:

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

达戈利斯:

好的,根据您上次的回复,您似乎只是在寻找可以转储 python 表达式的代码,您可以控制 unicode 和其他数据类型的打印方式。这是提供此控件的非常简单的函数。有一些方法可以使这个函数更有效(例如,通过使用字符串缓冲区而不是在这里进行所有递归字符串连接)。这仍然是一个非常简单的函数,就目前而言,它的执行可能仍然由您的数据库查找决定。

正如您在每个 '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}

我继续使用 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 的回复。