pinahq / sql-parser
Requires (Dev)
- php-coveralls/php-coveralls: ~1.0
- phpunit/phpunit: 6.*
This package is auto-updated.
Last update: 2024-08-29 05:00:23 UTC
README
这个库接受MySQL CREATE TABLE
语句并返回一个表示其定义的表的数据结构。支持MySQL语法版本5.7。此库不尝试验证输入 - 目标是分解有效的CREATE TABLE
语句。
安装
您可以使用composer安装此包。将其添加到您的composer.json
composer require iamcal/sql-parser
然后您可以使用composer自动加载器来加载它
require_once 'vendor/autoload.php';
use iamcal\SQLParser;
$parser = new SQLParser();
如果您不使用composer,您可以直接包含src/SQLParser.php
。
使用方法
提取SQL中定义的表
$parser = new SQLParser();
$parser->parse($sql);
print_r($parser->tables);
tables
属性是一个数组,每个数组都定义了表的结构的嵌套数组结构
CREATE TABLE `achievements_counts` (
`achievement_id` int(10) unsigned NOT NULL,
`num_players` int(10) unsigned NOT NULL,
`date_updated` int(10) unsigned NOT NULL,
PRIMARY KEY (`achievement_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
[
'achievements_counts' => [
'name' => 'achievements_counts',
'fields' => [
[
'name' => 'achievement_id',
'type' => 'INT',
'length' => '10',
'unsigned' => true,
'null' => false,
],
[
'name' => 'num_players',
'type' => 'INT',
'length' => '10',
'unsigned' => true,
'null' => false,
],
[
'name' => 'date_updated',
'type' => 'INT',
'length' => '10',
'unsigned' => true,
'null' => false,
],
],
'indexes' => [
[
'type' => 'PRIMARY',
'cols' => [
[
'name' => 'achievement_id',
],
],
],
],
'props' => [
'ENGINE' => 'InnoDB',
'CHARSET' => 'utf8',
],
],
]
您也可以直接使用词法分析器来处理其他SQL片段
$parser = new SQLParser();
$parser->lex($sql);
print($parser->tokens);
tokens
属性包含一个令牌数组。SQL关键字以大写形式返回,多词术语(例如DEFAULT CHARACTER SET
)作为一个单独的令牌。字符串和转义标识符不再进一步处理;它们将按照输入SQL中的表达式返回。
性能
我的测试目标是包含Glitch主数据库中的114张表的88K SQL文件。
第一个版本使用php-sql-parser,仅对输入进行词法分析就花费了超过60秒。这显然不是一个好选择。
当前实现使用手写的词法分析器,对相同输入进行词法分析大约需要140ms,并施加了更少的奇怪限制。这似乎是正确的方法。
历史
创建此库是为了解析多个CREATE TABLE
模式并比较它们,以便找出将一个迁移到另一个需要做什么。
这是基于b3ta、Flickr和Tiny Speck使用的系统,用于检查生产数据库和开发数据库以及分片实例之间的差异。原始系统只显示diff(见SchemaDiff),但这有点麻烦。
不支持的功能
MySQL表定义有很多选项,所以一些东西根本不支持。包括
UNION
表属性TABLESPACE
表属性- 表分区
- 空间字段类型
如果您需要支持这些功能之一,请打开一个问题或(更好的是)发送带有测试的pull request。