如何使用简单的查询将JSON文件导入MySQL数据库,而无需将其实际转换为CSV等任何其他文件格式?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何使用简单的查询将JSON文件导入MySQL数据库,而无需将其实际转换为CSV等任何其他文件格式?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4594字,纯文字阅读大概需要7分钟。
内容图文
![如何使用简单的查询将JSON文件导入MySQL数据库,而无需将其实际转换为CSV等任何其他文件格式?](/upload/InfoBanner/zyjiaocheng/888/93ae644cf3e042219bf3b9c3804da6da.jpg)
我试图导入一个看起来像这样的JSON文件:
[
{
"executionDateTime":"2017-07-07 15:21:15",
"A":1,
"B":1
},
{
"executionDateTime":"2017-07-07 15:21:15",
"A":2,
"B":2
},
{
"executionDateTime":"2017-07-07 15:21:15",
"A":3,
"B":3
},
{
"executionDateTime":"2017-07-07 15:21:15",
"A":4,
"B":4
}]
我想将上面的文件导入mySQL数据库,我希望我的表看起来像这样:
executionDateTime A B
2017-07-07 15:21:15 1 1
2017-07-07 15:21:15 2 2
2017-07-07 15:21:15 3 3
2017-07-07 15:21:15 4 4
我已经尝试过以下查询(如果文件格式为CSV,这对我来说会很有效),但它不起作用.
LOAD DATA local INFILE '<path>/my_file.json'
INTO TABLE database_name.my_table FIELDS TERMINATED BY ','
ENCLOSED BY '"'LINES TERMINATED BY '\n' IGNORE 1 ROWS;
上面的查询给了我一个看起来像这样的表:
(我知道,mySQL有一个不起作用的进口文件,但我不想使用那个功能,一个查询我正在寻找… :))
如果有人不得不面对这样的问题并得到解决方案,请建议.如果没有提供实际可行的解决方案,请不要将此问题标记为重复.
非常感谢.
解决方法:
我希望在不久的将来有一个MySQL的本机功能.
选项(不是简单查询)类似于以下脚本(根据需要进行调整).根据项目数量可能会有性能问题.
文件:/path/to/file/loadsetProfile.json:
[
{
"executionDateTime":"2017-07-07 15:21:15",
"A":1,
"B":1
},
{
"executionDateTime":"2017-07-07 15:21:15",
"A":2,
"B":2
},
{
"executionDateTime":"2017-07-07 15:21:15",
"A":3,
"B":3
},
{
"executionDateTime":"2017-07-07 15:21:15",
"A":4,
"B":4
}
]
MySQL命令行:
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.18 |
+-----------+
1 row in set (0.00 sec)
mysql> DROP PROCEDURE IF EXISTS `import_from_json`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP FUNCTION IF EXISTS `uuid_to_bin`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE IF EXISTS `temp_my_table`, `my_table`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `temp_my_table` (
-> `id` BINARY(16) NOT NULL PRIMARY KEY,
-> `content` JSON NOT NULL
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `my_table` (
-> `executionDateTime` TIMESTAMP,
-> `A` BIGINT UNSIGNED,
-> `B` BIGINT UNSIGNED
-> );
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE FUNCTION `uuid_to_bin` (`id` VARCHAR(36))
-> RETURNS BINARY(16)
-> DETERMINISTIC
-> RETURN UNHEX(REPLACE(`id`, '-', ''));
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE `import_from_json`(`_id` VARCHAR(36))
-> BEGIN
-> DECLARE `_id_current_json` BINARY(16) DEFAULT `uuid_to_bin`(`_id`);
-> DECLARE `_items_length`,
-> `_current_item` BIGINT UNSIGNED DEFAULT 0;
-> DECLARE `_content` JSON DEFAULT (SELECT `content`
-> FROM `temp_my_table`
-> WHERE `id` = `_id_current_json`);
->
-> IF JSON_VALID(`_content`) THEN
-> SET `_items_length` := JSON_LENGTH(`_content`),
-> @`insert_import_from_json` := NULL;
-> WHILE `_current_item` < `_items_length` DO
-> SET @`insert_import_from_json` := CONCAT('
'> INSERT INTO `my_table` (
'> `executionDateTime`,
'> `A`,
'> `B`
'> )
'> SELECT
'> `content` ->> \'$[', `_current_item`, '].executionDateTime\',
'> `content` ->> \'$[', `_current_item`, '].A\',
'> `content` ->> \'$[', `_current_item`, '].B\'
'> FROM `temp_my_table`
'> WHERE `id` = \'', `_id_current_json`, '\'
'> ');
-> PREPARE `stmt` FROM @`insert_import_from_json`;
-> EXECUTE `stmt`;
-> SET `_current_item` := `_current_item` + 1;
-> END WHILE;
->
-> IF `_current_item` > 0 THEN
-> SET @`insert_import_from_json` := NULL;
-> DEALLOCATE PREPARE `stmt`;
-> END IF;
-> END IF;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> SET @`UUID` := UUID();
Query OK, 0 rows affected (0.00 sec)
mysql> LOAD DATA LOCAL INFILE '/path/to/file/loadsetProfile.json'
-> INTO TABLE `temp_my_table`
-> LINES TERMINATED BY '\r'
-> (`content`)
-> SET `id` = `uuid_to_bin`(@`UUID`);
Query OK, 1 row affected (0.00 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
mysql> CALL `import_from_json`(@`UUID`);
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT
-> `executionDateTime`,
-> `A`,
-> `B`
-> FROM
-> `my_table`;
+---------------------+------+------+
| executionDateTime | A | B |
+---------------------+------+------+
| 2017-07-07 15:21:15 | 1 | 1 |
| 2017-07-07 15:21:15 | 2 | 2 |
| 2017-07-07 15:21:15 | 3 | 3 |
| 2017-07-07 15:21:15 | 4 | 4 |
+---------------------+------+------+
4 rows in set (0.01 sec)
内容总结
以上是互联网集市为您收集整理的如何使用简单的查询将JSON文件导入MySQL数据库,而无需将其实际转换为CSV等任何其他文件格式?全部内容,希望文章能够帮你解决如何使用简单的查询将JSON文件导入MySQL数据库,而无需将其实际转换为CSV等任何其他文件格式?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。