你可以在MySql中一般将一行转换为json吗?

时间:2018-03-15 15:07:14

标签: mysql json serialization

我想从DynamoDB切换到AWS Aurora MySql,但我遇到了障碍。我在我的一些Dynamo表上触发了一个触发lambda函数的触发器。我在Aurora中需要相同的功能,它由mysql.lambda_async函数提供。第一个参数是lambda ARN,第二个参数是将被发送到lambda函数的Json。

我希望能够序列化新的或更新的行,而无需知道所有列。每次更改/添加/删除列时都必须更新触发器是不方便的。

有没有办法在MySql中序列化一行而不知道从中选择的表的模式?

如果不是,我想我的下一个问题是,是否有办法迭代连续的字段,以便我可以自己创建该功能。如果是这样,我将创建一个新的SO问题。

1 个答案:

答案 0 :(得分:0)

好吧我找到了办法,但对我来说没用。我猜你不能在触发器或函数内部执行一个准备好的语句,所以它没关系。

这是我的代码,如果有人想要尝试它。传入表和密钥信息,它遍历列,使用预准备语句检索每列的值,并为每个列/值对生成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 ;