我想从DynamoDB切换到AWS Aurora MySql,但我遇到了障碍。我在我的一些Dynamo表上触发了一个触发lambda函数的触发器。我在Aurora中需要相同的功能,它由mysql.lambda_async函数提供。第一个参数是lambda ARN,第二个参数是将被发送到lambda函数的Json。
我希望能够序列化新的或更新的行,而无需知道所有列。每次更改/添加/删除列时都必须更新触发器是不方便的。
有没有办法在MySql中序列化一行而不知道从中选择的表的模式?
如果不是,我想我的下一个问题是,是否有办法迭代连续的字段,以便我可以自己创建该功能。如果是这样,我将创建一个新的SO问题。
答案 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 ;