taeluf / json-to-mysql
v2.0.x-dev
2023-07-15 22:40 UTC
Requires (Dev)
- taeluf/tester: v0.3.x-dev
This package is auto-updated.
Last update: 2024-09-16 06:23:42 UTC
README
将大型 JSON 文件转换为 MySql。使用 fgets()
并逐行解析 json 以最小化内存使用。也适用于较小的 json。还将输出 sql
文件分块到所需的大小。
示例
JSON 必须是这种格式
[
{"name": "row1", "index": 0},
{"name": "row2", "index": 1}
]
执行它
<?php
// variables you'll want to change
$source_file = $this->file('test/input/main.json');
$out_prefix = $this->file('test/input/main.out/test_sql');
$table_name = 'test_sql';
// max `strlen()` of the sql put into any one output file
$max_sql_len = 1024*1024;
// a pdo instance for running the create & insert
$pdo = new \PDO("sqlite::memory:");
// generate all the sql
$jtm = new \Tlf\Jtm();
$schema_info = $jtm->generate_schema_info($source_file);
$schema = $jtm->generate_schema($source_file, $schema_info);
$create_sql = $jtm->generate_sql_create($table_name, $schema);
$jtm->generate_sql_insert($source_file, $out_prefix, $table_name, $schema, $max_sql_len);
//execute the sql
$pdo->exec($create_sql);
$num_rows = $jtm->execute_insert_files($out_prefix, $pdo);
安装
composer require taeluf/json-to-mysql v2.0.x-dev
或在您的 composer.json
{"require":{ "taeluf/json-to-mysql": "v2.0.x-dev"}}
版本(分支)
- v1.0:令人失望的 api 的旧版本
- v2.0:具有更简洁 api 的新版本
功能
- 读取小或大 JSON 源文件,并输出 mysql 创建语句和插入语句
- 分块插入语句,限制输出文件的最大长度
- 输出 json 文件所有行的列数据
- 将嵌套数组转换为 JSON 字符串以进行 INSERT
- 尝试使用正确的列类型(文本、布尔、varchar、int、float)
- 根据生成的模式构建表
内存占用非常小 - 逐行读取输入文件并逐行输出插入 sql 文件
额外说明
警告
- 将长度设置为至少
1024*1024
(大约一兆字节),否则您可能会从大型数据集中获得数千个文件 - 将长度设置为小于插入语句长度的…可能是非常糟糕的
列数据 ($jtm->generate_schema_info()
)
- 每个
is_
条目计算匹配该is_
的行数 sampleValue
是该列找到的最长值
<?php
[
'name' => [
'maxlen' => 4,
'minlen' => 4,
'count' => 2,
'is_string' => 2,
'is_numeric' => 0,
'is_int' => 0,
'is_float' => 0,
'is_bool' => 0,
'is_array' => 0,
'is_date' => 0,
'is_json' => 0,
'sampleValue' => 'row2',
],
'index'=>[
'maxlen' => 1,
'minlen' => 1,
'count' => 2,
'is_string' => 0,
'is_numeric' => 2,
'is_int' => 2,
'is_float' => 2,
'is_bool' => 0,
'is_array' => 0,
'is_date' => 0,
'is_json' => 0,
'sampleValue' => 1,
]
],
待办事项(可能)
- 一个类似
create_and_insert_from_json($json_file_path, $pdo)
的函数... 仅用一个命令即可完成所有操作 - 编写 bash 脚本来从 cli 执行生成
- 编写一个 bash 脚本来压缩、上传和解压缩 sql 文件
- 编写一个将所有 sql 文件导入数据库的 bash 脚本