taeluf/json-to-mysql

v2.0.x-dev 2023-07-15 22:40 UTC

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 脚本