15

我面临的问题是将 JSON 导入 Mysql。我搜索了互联网,搜索了 stackoverflow,可能还有更多来源,但找不到一个合适的解决方案。在这里全面披露——我不是 PHP、SQL,也不是 JSON 专业人士。

我要完成的工作相当简单:将此 JSON 文件https://developers.facebook.com/tools/explorer/method=GET&path=245226895508982%2Ffeed%3Faccess_token%3D%3Caccess_token%3E= 导入 Mysql 数据库。我知道我需要以某种方式将 JSON 数据分配到列中,然后根据内容相应地管理行。我不需要所有数据,但需要大部分数据。稍后应通过用户的搜索查询回显数据。

我的问题似乎很简单——我该怎么做?

PS:我尝试将其转换为 XML,但我没有足够的权限将 XML 导入 SQL 数据库。转换器也不是最好的工作。

4

6 回答 6

13

您可以将 json 导出为 csv:http ://www.danmandle.com/blog/json-to-csv-conversion-utility/或https://github.com/danmandle/JSON2CSV

然后 :

LOAD DATA INFILE 'filepath/your_csv_file.csv' INTO TABLE tablename;

单打应该没问题。

有关加载数据 infile的更多信息。

于 2013-06-28T14:50:20.887 回答
9

就像其他人所说的那样,您将不得不做一些转换才能完成您的要求。幸运的是,让 PHP 遍历数据并为您完成大部分工作并不难。这是一个快速而肮脏的尝试:

// MySQL table's name
$tableName = 'my_table';
// Get JSON file and decode contents into PHP arrays/values
$jsonFile = '/path/to/file.json';
$jsonData = json_decode(file_get_contents($jsonFile), true);

// Iterate through JSON and build INSERT statements
foreach ($jsonData as $id=>$row) {
    $insertPairs = array();
    foreach ($row as $key=>$val) {
        $insertPairs[addslashes($key)] = addslashes($val);
    }
    $insertKeys = '`' . implode('`,`', array_keys($insertPairs)) . '`';
    $insertVals = '"' . implode('","', array_values($insertPairs)) . '"';

    echo "INSERT INTO `{$tableName}` ({$insertKeys}) VALUES ({$insertVals});" . "\n";
}

这会吐出一系列INSERT INTO my_table(...) VALUES (...); 您可以保存到 .sql 文件并导入 MySQL 的 SQL 语句。使用这种方法,每个 INSERT 可以有不同的列而不会引起问题。

注意:addslashes() 不是一种非常安全的方法,像 real_escape_string() 这样的方法更可取,但假设您的 JSON 数据是可信赖的,则此方法无需数据库连接即可工作。

于 2015-11-05T20:17:20.507 回答
6

使用MySQL Shell 8.0.13util.importJson ,您可以使用shell API 函数或命令行选项将 JSON 文档直接导入 MySQL 服务器--import。例如从文件导入:

mysqlsh user@host:port/database --import /tmp/facebook.json collection_name

或将 JSON 文档通过管道传输到标准输入:

cat /tmp/facebook.json | mysqlsh user@host:port/database --import - collection_name

collection_name集合哪里。

有关 MySQL Shell 的 JSON 导入实用程序的更多信息:https ://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-json.html

有关文档存储的更多信息:https ://dev.mysql.com/doc/refman/8.0/en/document-store.html

有关文档和集合的更多信息:https ://dev.mysql.com/doc/refman/8.0/en/mysql-shell-tutorial-javascript-documents-collections.html

于 2018-10-22T16:18:48.117 回答
1

以下内容经过测试并适用于 MySQL 8.0.18。我希望它适用于任何支持 JSON 数据类型和加载数据语句的版本。

可以使用来自任何 SQL 客户端的load data语句加载 JSON 文件。假设用户具有运行语句的适当权限和对文件的适当访问权限。

create table jsonTableName( jsonColumnName json );

load data infile '/var/lib/mysql-files/someFile.json'
  into table jsonTableName
  fields terminated by '\0' escaped by ''
  lines terminated by '\0';

由 '\0' 终止的字段和行禁用字段和行解析,因此假设整个文件是单个单元格。

由 '' 转义会禁用由加载程序解释的\ 。因此允许\"直接发送到 JSON 解析器。没有它,任何转义序列都将被不正确地加载,可能导致异常。

当 JSON 文件位于您的本地机器上并且 MySQL 服务器不在(用于远程传输)时,请使用加载数据 LOCAL infile (如@Vijay 建议的那样)。请记住,仅当服务器和您的客户端都已配置为允许时,本地才有效。使用选择@@local_infile;检查服务器设置(0 表示不允许,1 表示允许)。对于 MySQL Workbench 客户端,在 Connection -> Advanced -> Others 中添加OPT_LOCAL_INFILE=1 。对于 IntelliJ/Datagrip 客户端,在高级连接设置中将 allowLoadLocalInfile设置为true

于 2019-11-25T21:49:26.997 回答
0

我从在 Youtube 上看到从 json 导入 MySQL 视频中得到了这个想法。Json_import_into_MySQL。因此,您可以使用 MySQL Workbench 将 json 文件导入到表中。

  1. 使用将包含转储文件数据的列创建一个表。

更新

不必事先创建表。Workbench 将从转储文件中创建它。

  1. 开放式工作台
  2. 选择左侧的架构选项卡。(我在 Ubuntu 上使用 MySQL Workbench 8.0)如果侧边栏不可见,则从视图 -> 面板 -> 显示侧边栏显示它。

仅当您要填充已经存在的表时

  1. 选择要在其中导入转储文件的架构 -> 表。
  2. 右键单击要导入的表。
  3. 然后选择表数据导入向导。(从上数第 5 个)。

  1. 单击或粘贴您要导入的文件的 url。记得把csv改成json格式;在右下角。

如果没有选择表。请输入表名,否则 wrokbench 将使用转储文件名作为表名。

  1. Workbench 将自动将列头与表字段进行协调。
  2. 单击完成以完成导入。

请记住将列类型更改为相关的;因为 Workbench 将默认使用 TEXT。首先找到字段中字符的最大长度,然后更改它。

例如。

SELECT 
  max(length(province)) `province`,  
  max(length(cnic)) `cnic`,  
  max(length(`name`)) `name`,  
  max(length(district)) `district`,  
  max(length(fatherName)) `fatherName`
from tab1;

ALTER TABLE tab1
  CHANGE province province CHAR(16), 
  CHANGE cnic cnic CHAR(20), 
  CHANGE `name` `name` CHAR(70), 
  CHANGE district district CHAR(34), 
  CHANGE fatherName fatherName CHAR(43);
于 2020-10-02T09:47:29.543 回答
0

我知道这是一个旧帖子,但也许它可以帮助某人。我想在 mysql 中创建与在 mongoDb 中相同的数据库。

我有一个包含数据(不是结构)的有效 json 文件,然后我在 mysql 中创建了一个具有适当结构的表(根据 json 数据),并通过 MySql 工作台导入它。

是 csv 的示例,但您可以加载 json 文件。只需按照向导将数据导入表并确保结构有效,否则将不会导入任何内容。

于 2016-07-11T09:20:25.527 回答