Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中作为json数组的扳手SELECT语句_Python_Arrays_Json_Google Cloud Platform_Google Cloud Spanner - Fatal编程技术网

Python中作为json数组的扳手SELECT语句

Python中作为json数组的扳手SELECT语句,python,arrays,json,google-cloud-platform,google-cloud-spanner,Python,Arrays,Json,Google Cloud Platform,Google Cloud Spanner,我试图在扳手中运行select语句,该语句返回多行并将结果转换为json格式 代码如下: def fetchmessages(self, pushid): rc = ResultCode.SUCCESS messages = "" def selectmessages(transaction): messages = transaction.execute_update(

我试图在扳手中运行select语句,该语句返回多行并将结果转换为json格式

代码如下:

def fetchmessages(self, pushid):
            rc = ResultCode.SUCCESS
            messages = ""

            def selectmessages(transaction):
                    messages = transaction.execute_update(
                    "SELECT Message.message_text FROM Message LEFT JOIN MessageStatus "
                    "ON (Message.message_id = MessageStatus.message_id) WHERE "
                    "MessageStatus.push_id = @id",
                    params={'id' : (pushid)},
                    param_types={'id' : param_types.STRING}
            )

            try:
                    self.client.run_in_transaction(selectmessages)
            except Exception as fetchexception:
                    rc = ResultCode.ERR_NO_MSG_FOUND
                    self.logger.debug(fetchexception)
                    pass

            if ResultCode.SUCCESS:
                    output = "{ 'pushid':'" + pushid + "', 'messages':" + messages + ", 'resultcode':" + str(rc.value) + "}"

            return output
调用函数只是通过jsonify运行输出并将其打印出来。上面的代码打印出来:

"{ 'pushid':'cdd92f4ce847efa5c7f', 'messages':, 'resultcode':1}"
我希望它打印出如下内容:

"{ 'pushid':'cdd92f4ce847efa5c7f', 'Messages': [{'message': 'foo bar'}, { 'message': 'core dump'}], 'resultcode': 1}"

我该怎么做呢?

看起来您的事务只是一个select语句。我建议使用如下所示的execute_sql方法:

spanner_client = spanner.Client()
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)

with database.snapshot() as snapshot:
    results = snapshot.execute_sql(
        "SELECT Message.message_text FROM Message LEFT JOIN MessageStatus "
        "ON (Message.message_id = MessageStatus.message_id) WHERE "
        "MessageStatus.push_id = @id",
        params={'id' : (pushid)},
        param_types={'id' : param_types.STRING})

    for row in results:
        print(u'Message: {}'.format(*row))
  • 您的
    JOIN
    声明中有一个问题:

    • 每个
      push\u id
      包含几个
      message\u id
      ,因此这两个表应该在
      push\u id
      上连接,而不是
      message\u id
  • 消息
    消息状态
    之间的潜在关系问题:

    • push_id
      应该是
      MessageStatus
      的主键,而
      MessageStatus
      应该是
      Message
      的父项,请使用以下示例检查DDL设置是否正确:
  • DDL:

    查询脚本:

    from google.cloud import spanner
    
    def fetch_messages(instance_id, database_id):
        spanner_client = spanner.Client()
        instance = spanner_client.instance(instance_id)
        database = instance.database(database_id)
    
        with database.snapshot() as snapshot:
            results = snapshot.execute_sql(
                'SELECT Message.push_id, Message.message_id, Message.message_text FROM Message LEFT JOIN MessageStatus '
                'ON MessageStatus.push_id = Message.push_id WHERE MessageStatus.push_id="JDHK65FTRD832KJ"')
            for row in results:
                print(u'push_id: {}, message_id: {}, message_text: {}'.format(*row))
    
    
    fetch_messages([INSTANCE_ID], [DATABASE_ID])
    
    结果:

    push_id: JDHK65FTRD832KJ, message_id: 1, message_text: First
    push_id: JDHK65FTRD832KJ, message_id: 2, message_text: Second
    push_id: JDHK65FTRD832KJ, message_id: 3, message_text: Third
    
    GCP资源:

    push_id: JDHK65FTRD832KJ, message_id: 1, message_text: First
    push_id: JDHK65FTRD832KJ, message_id: 2, message_text: Second
    push_id: JDHK65FTRD832KJ, message_id: 3, message_text: Third