【问题标题】:Importing JSON file to MySQL 5.7将 JSON 文件导入 MySQL 5.7
【发布时间】:2019-09-19 16:23:12
【问题描述】:

我无法在 Mysql 5.7 中将 .json 文件作为表导入;所有行都保持空白。我不确定错误在哪里。

我正在使用/home/name/json_data/sample.json下存储的以下json文件

{
    "price": null,
    "sale_list": [
        {
            "buyer": "SmackMe089",
            "date": "April 29th 2019 21:20:50",
            "id": "1234",
            "item_desc": ""
        }
}

当我尝试使用以下sql 文件将其导入 mysql 5.7 时,没有导入任何内容。

文件.sql:

CREATE TABLE example_table (
         id INT NOT NULL AUTO_INCREMENT,
         json_data JSON NOT NULL,
         PRIMARY KEY (id)
);

LOAD DATA INFILE '/home/path/json_data/sample.json' INTO TABLE example_table (json_data);

尝试导入mysql: mysql --host=host_ip -u root -p db_name < /home/path/data/file.sql

【问题讨论】:

  • 你不能在 MySQL 5.7 中使用LOAD DATA 来导入 JSON。从 MySQL 8+ 开始,有一个新的 shell 工具 util.importJson 可以直接将 JSON 文件解析为表模式。如果您对此有持续需求,不妨考虑升级。
  • 我引用 mysqlserverteam.com/… 我知道 sql 8.0 有一个很好的闪亮 mysqlsh 工具来导入 json。我希望在迁移之前使用我所拥有的东西并引用 - mysqlserverteam.com/…
  • 旁注 - @TimBiegeleisen - 支持加载数据,所以我有点困惑你的理性是什么 - dev.mysql.com/doc/refman/5.7/en/load-data.html
  • 是的,LOAD DATA 受支持,但对于 CSV,而不是 JSON,文件。

标签: mysql json import mysql-5.7


【解决方案1】:

有几个选项:

  1. 13.2.6 LOAD DATA Syntax
  2. 7.2 JSON Import Utility

测试:

$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.7.26 MySQL Community Server (GPL)

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.26    |
+-----------+
1 row in set (0.00 sec)

mysql> DROP TABLE IF EXISTS `test`.`example_table`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `test`.`example_table` (
    ->   `id` INT NOT NULL AUTO_INCREMENT,
    ->   `json_data` JSON NOT NULL,
    ->   PRIMARY KEY (`id`)
    -> );
Query OK, 0 rows affected (0.01 sec)

1.加载数据

文件/path/to/file/sample.json

{"price": null, "sale_list": [{"buyer": "SmackMe089", "date": "April 29th 2019 21:20:50", "id": "1234", "item_desc": ""}]}

MySQL 命令行客户端

mysql> LOAD DATA INFILE '/path/to/file/sample.json'
    -> INTO TABLE `test`.`example_table` (`json_data`);
Query OK, 1 row affected (0.01 sec)
Records: 1  Deleted: 0  Skipped: 0  Warnings: 0

mysql> SELECT `id`, `json_data`
    -> FROM `test`.`example_table`\G
*************************** 1. row ***************************
       id: 1
json_data: {"price": null, "sale_list": [{"id": "1234", "date": "April 29th 2019 21:20:50", "buyer": "SmackMe089", "item_desc": ""}]}
1 row in set (0.00 sec)

2。 JSON 导入实用程序

文件/path/to/file/sample.json

{
    "price": null,
    "sale_list": [
        {
            "buyer": "SmackMe089",
            "date": "April 29th 2019 21:20:50",
            "id": "1234",
            "item_desc": ""
        }
    ]
}

MySQL Shell:正如@TimBiegeleisen 所说,您可以使用MySQL Shell(即使使用MySQL 5.7),但您必须激活X Plugin

$ mysqlsh --sql
MySQL Shell 8.0.16

Your MySQL connection id is 2 (X protocol)
Server version: 5.7.26 MySQL Community Server (GPL)
No default schema selected; type \use <schema> to set one.

MySQL 127.0.0.1:15726+ SQL > SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.26    |
+-----------+
1 row in set (0.0004 sec)

MySQL 127.0.0.1:15726+ SQL > SELECT `id`, `json_data`
                          -> FROM `test`.`example_table`\G
*************************** 1. row ***************************
       id: 1
json_data: {"price": null, "sale_list": [{"id": "1234", "date": "April 29th 2019 21:20:50", "buyer": "SmackMe089", "item_desc": ""}]}
1 row in set (0.00 sec)

MySQL 127.0.0.1:15726+ SQL > \js
Switching to JavaScript mode...

MySQL 127.0.0.1:15726+ JS > util.importJson('/path/to/file/sample.json', {schema: 'test', table: 'example_table', tableColumn: 'json_data'});
Importing from file "/path/to/file/sample.json" to table `test`.`example_table` in MySQL Server at 127.0.0.1:15726

.. 1.. 1
Processed 204 bytes in 1 document in 0.0007 sec (1.36K documents/s)
Total successfully imported documents 1 (1.36K documents/s)

MySQL 127.0.0.1:15726+ JS > \sql
Switching to SQL mode... Commands end with ;

MySQL 127.0.0.1:15726+ SQL > SELECT `id`, `json_data`
                          -> FROM `test`.`example_table`\G
*************************** 1. row ***************************
       id: 1
json_data: {"price": null, "sale_list": [{"id": "1234", "date": "April 29th 2019 21:20:50", "buyer": "SmackMe089", "item_desc": ""}]}
1 row in set (0.0007 sec)
*************************** 2. row ***************************
       id: 2
json_data: {"price": null, "sale_list": [{"id": "1234", "date": "April 29th 2019 21:20:50", "buyer": "SmackMe089", "item_desc": ""}]}
2 rows in set (0.0006 sec)

【讨论】:

    【解决方案2】:

    没有办法使用 LOAD DATA INFILE 来加载 JSON,因为正如上面的 cmets 所说,该语句只加载 CSV 数据。

    如果要将 JSON 文档加载为标量以插入表格的一行,可以使用 LOAD_FILE() 函数。

    INSERT INTO example_table SET json_data = LOAD_FILE('/home/path/json_data/sample.json');
    

    这只会创建一行来存储整个 JSON 文档。它不会解析 JSON 以在 JSON 中为您的 sales_list 数组中的每个条目插入单独的行。

    阅读我链接到的文档,了解有关 LOAD_FILE() 函数的更多信息。

    【讨论】:

    • MySQL shell (mysqlsh) 从 8.0.17(左右)开始有一个并行的 JSON/CSV/TSV 批量加载器
    猜你喜欢
    • 2018-11-26
    • 2013-06-26
    • 2016-10-22
    • 2017-12-19
    • 1970-01-01
    • 2015-07-01
    • 2011-07-06
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多