Spanner Python客户端“绑定参数记录错误的值无效”

时间:2018-11-03 18:06:09

标签: python google-cloud-platform google-cloud-spanner

我正在尝试在Spanner中执行select语句并出现以下错误:

InvalidArgument: 400 Invalid value for bind parameter record: Expected STRUCT<Msg_id STRING>

我无法弄清为什么它抱怨绑定参数,因为代码将绑定参数定义为STRING。

    requested_msg_id = str(msg['Message Id'])
    rc = ResultCode.SUCCESS
    ## SELECT MessageSender, Message FROM MESSAGE_STORE where MessageId = msg_id

    record_type = param_types.Struct([
        param_types.StructField('Msg_id', param_types.STRING)
    ])

    with self.client.snapshot() as snapshot:
        try:
            results = snapshot.execute_sql(
                "SELECT MessageSender, Message from MESSAGE_STORE "
                "WHERE MessageId = @record.Msg_id LIMIT 1",
                params={'record' : (requested_msg_id)},
                param_types={'record' : record_type})
        except Exception as fetch_exception:
             rc = ResultCode.ERR_NO_MSG_FOUND

    # results is an interator
    for row in results:
        if row: 
            output = "{ 'Message Id':" + requested_msg_id + ", 'Sender':" + row[1] + ", 'Message':" + row[2] + ", 'Result Code':" + str(rc.value) + "}"

如您所见,第1行上requested_msg_id的值是一个字符串。然后在第6行中,将Msg_Id定义为STRING绑定参数。谁能看到我想念的东西吗?

1 个答案:

答案 0 :(得分:1)

在SQL中,您说的是参数“ record”是带有Msg_id(@ record.Msg_id)的结构。 您还说参数'record'的类型是带有字符串'Msg_id'值的结构(第5,6和15行)

但是,然后您为参数“ record”(第1行和第14行)传递的值是一个简单的字符串,而不是结构,因此是错误。

您需要说参数是SQL中的简单字符串(例如@Msg_id),然后在第15行中将类型指定为字符串...(这样更容易,而无需定义record_type) 或将param值创建为