Python中作为json数组的扳手SELECT语句
我试图在扳手中运行select语句,该语句返回多行并将结果转换为json格式 代码如下: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(
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
的父项,请使用以下示例检查DDL设置是否正确:Message
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