我想从 DynamoDB 切换到 AWS Aurora MySql,但遇到了障碍。我的一些 Dynamo 表上有一个触发器,可以触发 lambda 函数。我在 Aurora 中需要相同的功能,它由 mysql.lambda_async 函数提供。第一个参数是 lambda ARN,第二个参数是将发送到 lambda 函数的 Json。
我希望能够序列化新的或更新的行,而不必知道所有列。每次我们更改/添加/删除列时都必须更新触发器,这会很不方便。
有没有办法在不知道从中选择的表的架构的情况下序列化 MySql 中的行?
如果不是,我想我的下一个问题是是否有一种方法可以迭代连续的字段,以便我可以自己创建函数。如果是这样,我将创建一个新的问题。
最佳答案
好吧,我想出了一个办法,但对我来说没用。我想你不能在触发器或函数内执行准备好的语句,所以这并不重要。
如果有人想尝试的话,这是我的代码。您传入表和关键信息,它循环遍历列,使用准备好的语句检索每列的值,并为每个列/值对生成 JSON。可能有更性感的方法可以做到这一点,但它很实用。
DELIMITER $$
CREATE PROCEDURE GenerateJson (primaryKey varchar(50), id varchar(250), tableName varchar(200), INOUT json_result varchar(4000))
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_json varchar(100) DEFAULT "";
-- declare cursor for all table columns
DEClARE json_cursor CURSOR FOR
Select COLUMN_NAME from INFORMATION_SCHEMA.Columns Where TABLE_NAME = tableName;
-- declare NOT FOUND handler
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET v_finished = 1;
OPEN json_cursor;
Set json_result = Concat('{ Table:', '''',tableName,'''', ',', 'KeyName: ', '''', primaryKey, '''', ', KeyValue: ', '''', id, '''', ', ', ' Item: {') ;
get_json: LOOP
FETCH json_cursor INTO v_json;
IF v_finished = 1 THEN
LEAVE get_json;
END IF;
SET @sql:=CONCAT('SELECT ',v_json, ' from ',tableName, ' WHERE ',primaryKey, ' = ', CONCAT('''',id,''''), ' Into @propVar;');
PREPARE dynamic_statement FROM @sql;
EXECUTE dynamic_statement;
DEALLOCATE PREPARE dynamic_statement;
SET @newJson = CONCAT(v_json, ': ', '"', @propVar, '"');
SET json_result = CONCAT(' ',json_result, @newJson, ',');
END LOOP get_json;
CLOSE json_cursor;
--trim last comma
SET json_result = CONCAT(LEFT(json_result, CHAR_LENGTH(json_result) -1), '');
SET json_result = CONCAT(json_result, ' }}');
END$$
DELIMITER ;
关于mysql - 你能在 MySql 中将行转换为 json 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302949/