繁体   English   中英

如何在shell脚本中将mysql存储过程的结果转换为JSON数据?

[英]How to convert result of mysql stored procedure to JSON data in shell script?

我想将MySQL存储过程的结果转换为JSON数据并插入到另一个表中。

当尝试使用varchar数据类型时,它可以正常工作,但是我需要JSON或数组类型的数据。

call="CALL status(input1,@data1,@data2,@data3.......)
select="select @data1, @data2, @data3.....;"

output=$(mysql --user=root --password=xxx db << eof 
$call
$select
eof)

mysql --user=root --password=xxx db << eof  
insert into sam values ('$output');
eof

这是输出结果,但我需要像JSON这样的输出。 如何构造为JSON并传递值以在MySQL中插入查询。

@data1  @data2  @data3  @data4  @data5  @data6  ..................
1213    1174    367 57  8   7398    39  .............

这是我的存储过程:

DELIMITER ;;

CREATE PROCEDURE status(
 IN input1 INT,
 IN input2 INT,
 OUT data1 INT,
 OUT data2 INT,
 OUT data3 INT)

BEGIN

--  data1
select count(*) INTO data1 from account where time >=input1 and time >=input2;

-- data2
SELECT SUM(if(status>0,1,0)) INTO data2 from account where time >=input1 and time >=input2;

-- data3
SELECT SUM(if(status=0,1,0)) INTO data3 from account where time >=input1 and time >=input2;

END

;;

我如何构造像JSON这样的输出? 我是这个主题的新手!

MySQL 5.7.8或更高版本支持JSON数据类型

从MySQL 5.7.8开始,MySQL支持本机JSON数据类型

如果是这种情况,则可以重写存储过程以直接输出所需的JSON数据。

示例数据

SET @data1 = 1213;
SET @data2 = 1174;
SET @data3 = 367;
SET @data4 = 57;
SET @data5 = 8;
SET @data6 = 7398;

SELECT示例

SELECT JSON_MERGE(
    JSON_OBJECT('@data1', @data1),
    JSON_OBJECT('@data2', @data2),
    JSON_OBJECT('@data3', @data3),
    JSON_OBJECT('@data4', @data4),
    JSON_OBJECT('@data5', @data5),
    JSON_OBJECT('@data6', @data6)
);

输出 (漂亮打印只是为了提高可读性)

{
    "@data1": 1213,
    "@data2": 1174,
    "@data3": 367,
    "@data4": 57,
    "@data5": 8,
    "@data6": 7398
}

然后,要利用MySQL JSON处理功能,目标列应具有JSON数据类型。 这样,您将可以在mysql中查询json。

巴什

如果您没有重写存储过程的特权,则可以使用以下肮脏的解决方案。 只需将( | )mysql的输出通过管道传递到awk(例如),在其中我们为所需字段应用必要的格式。 为此目的设计的工具会做得更好,例如: jojq

mysql --login-path=local -s -e 'SET @data1 = 1213; SET @data2 = 1174; SET @data3 = 367; SET @data4 = 57; SET @data5 = 8; SET @data6 = 7398; SELECT @data1, @data2, @data3, @data4, @data5, @data6' | awk '{ print "{\"@data1\":"$1",", "\"@data2\":"$2",", "\"@data3\":"$3",", "\"@data4\":"$4",", "\"@data5\":"$5",", "\"@data6\":"$6"}"}'

请注意--login-path=local ,而不是-u ... -p... (我在此处了解更多信息 ),用于MySQL身份验证。

UPDATE (仅适用于MySQL 5.7.8或更高版本)

我将这样重写您的存储过程:

DROP PROCEDURE IF EXISTS status_json;
DELIMITER @@
CREATE PROCEDURE status_json (
    IN input1 INT,
    IN input2 INT,
    OUT data JSON
)
proc: BEGIN

    SELECT JSON_MERGE(
       JSON_OBJECT('count', (SELECT COUNT(*) FROM account WHERE time >= input1 AND time >= input2)),
       JSON_OBJECT('sum_gt_0', (SELECT SUM(IF(status > 0, 1, 0)) FROM account WHERE time >= input1 AND time >= input2)),
       JSON_OBJECT('sum_eq_0', (SELECT SUM(IF(status = 0, 1, 0)) FROM account WHERE time >= input1 AND time >= input2))
    ) INTO data;

END proc @@
DELIMITER ;

称它为:

CALL status_json(123, 456, @json);

并使用ouptut:

SELECT @json;

重写存储过程的示例

CREATE TABLE account (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    time INT UNSIGNED NOT NULL,
    status TINYINT UNSIGNED NOT NULL
);

资料

INSERT INTO account (time, status) VALUES
(1513329548, 0),
(1513329528, 1),
(1513329508, 1),
(1513329648, 0),
(1513329148, 1),
(1513329540, 0),
(1513322548, 0),
(1513327548, 1);

调用和选择

CALL status_json(1513329508, 1513322548, @json);
SELECT @json;

结果

{"count": 5, "sum_eq_0": 3, "sum_gt_0": 2}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM