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

在数据库查询中用unicode表示python词典,python,unicode,orientdb,Python,Unicode,Orientdb,我有一个问题,我想知道如何有效地解决 我有JSON格式的数据(与转储/加载一起使用),并且包含unicode 这是用JSON实现的发送消息协议的一部分。因此,消息将作为字符串发送,然后加载到python字典中。这意味着表示形式(作为python字典)将类似于: "CREATE VERTEX TestVertex SET data = {u'mykey': u'myVal'}" {u“mykey”:u“myVal”} 系统处理这样的结构本身没有问题,但是当我要进行数据库查询来存储这个结构时,就会

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

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

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

"CREATE VERTEX TestVertex SET data = {u'mykey': u'myVal'}"
{u“mykey”:u“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的db查询(使用pyorient)来指定任意数据结构。正在设置的数据属性是OrientDB类型EMBEDDEDMAP

非常感谢您的帮助

EDIT1:

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

Dargolith:

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

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

正如sobolevn在评论中建议的那样,我继续使用json.dumps()。一开始我没有想到这个,因为我在驱动程序中没有真正使用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的回复。

{u'mykey':u'myVal'}
不是JSON,而是Python字典。JSON等价物应该是
{“mykey”:“myVal”}
,这与Python字典非常相似,在Python中是有效的,但原始的JSON无效。@cpburnz我实际上没有声明它是JSON。我说过这个表示结果是这样的(在使用dumps/loads->python dict之后)。虽然我并不认为它真的会影响所提出的问题,但我还是要感谢您指出它显然是不清楚的。更新了问题。除非你在字里行间的评论是我应该使用(导入)json并在dict上使用json.dumps,我同意这是一种方法。你说,你有一个命令:
“CREATE VERTEX TestVertex SET data={u'mykey':u'myVal'}”
,但你需要
“CREATE vertext testvertext data={'mykey':'myVal'}“
。您需要
json.dumps(您的python目录)
到普通的JSON。@sobolevn是的,我想是这样。我编写的db驱动程序本身并不使用JSON,它是用来操作您希望存储的任何python结构,与orientdb数据类型兼容,但我想我可以导入JSON,只是为了让实用程序在DICT和列表上使用转储。也许这是一种方法。我将此留到w我想看看是否有更多的人对我正在做的事情的基本原理有宝贵的意见或顾虑/想法,否则我会将其作为一个答案发布。谢谢!你的目标是要有一个地图/列表/字符串的特殊表示,其中字符串是单引号的,因为OrientDB需要这种格式?如果这是手头的问题,那么简单的递归f函数将Python列表、dict和字符串呈现为该格式可能是最简单的方法,而查询创建的成本应该由查询执行的成本决定,因此使事情比这个简单的方法更高效可能是不值得的。谢谢你的回答。我还没有尝试过。不过,你有什么意见吗与自制的解决方案相比,使用json.dumps()有什么不同?我已经尝试过json.dumps()有一段时间,它似乎提供了我在查询中所需的确切格式,至少对于我测试过的数据类型是这样。@dargolith:转储可能会更快,但您无法控制其格式。它将是有效的JSON。特别是,有效的JSON使用双引号,但在我看来,您希望字符串周围有单引号。如果您需要如果没有控制,那么你可以像我所展示的那样使用手工制作的翻车机。干杯,--谢谢你的澄清,很抱歉不清楚报价需要什么或不需要什么。在我的情况下,两者都很好,但是当你如你所说需要更多控制时,你的解决方案也是很好的参考。