如何使用简单的查询将JSON文件导入MySQL数据库,而无需将其转换为CSV等任何其他文件格式?

nmpmafwu  于 4个月前  发布在  Mysql
关注(0)|答案(4)|浏览(86)

我尝试导入一个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 DB中,并希望我的表看起来像这样:

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有一个导入文件的内置函数,但我不想使用该函数,查询是我要找的...:)
请建议,如果有人不得不面对这样的问题,并得到了解决方案。请不要标记为重复的问题,而没有给出一个实际上工作的解决方案。
很感谢。

hm2xizp9

hm2xizp91#

参考:https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html
我知道这是一个老的线程,但MySQL 5.7现在有一个JSON类型,你可以将JSON导入到一个字段中,然后你可以使用计算字段将JSON分割成单独的字段。下面是粗略的代码(未经测试):
创建一个JSON测试表:

CREATE TABLE IF NOT EXISTS jsontest(
     rowid INT AUTO_INCREMENT NOT NULL UNIQUE,
     jsondata json,
     `executionDateTime` TIMESTAMP,
     `A` BIGINT UNSIGNED,
     `B` BIGINT UNSIGNED,
     );

字符串
将JSON导入到JSON字段中:

LOAD DATA LOCAL INFILE '/path/to/testfile.json' into table jsontest(jsondata);


拆分您的数据(这可以合并到一个命令中)

UPDATE jsontest set executionDateTime=(jsondata->>'$.executionDateTime');
UPDATE jsontest set A=(jsondata->>'$.A');
UPDATE jsontest set B=(jsondata->>'$.B');


如果你不想有额外的字段,你可以像这样查询jsondata字段:

SELECT jsondata->>"$.executionDateTime" AS executionDateTime,
       jsondata->>"$.A" AS A,
       jsondata->>"$.B" AS B;

9avjhtql

9avjhtql2#

我希望在不久的将来有一个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)

6jjcrrmo

6jjcrrmo3#

我正在使用这个网页,它将json文件转换为sql文件,然后,我在toad mysql中执行脚本并工作。
我正在使用的网站的URI是converter web

50pmv0ei

50pmv0ei4#

GUI中有一种原生方式,您可以在其中导入/导出CSV和JSON文件。步骤1.启动WorkBench步骤2.导航到SQL架构步骤3.选择表步骤4.选择表后,查找一个标有结果网格的图标,该图标在悬停在表上时显示(显示表中的列,并在编辑选项旁边寻找一个小的导入图标)enter image description here 5.确保为值选择正确的列,瞧,工作75%其他25%的时间我只是复制和粘贴整个文件到 Postman 。

相关问题