Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sjjian/sql-calculator
这是一个基于 TiDB MySQL 语法解析器的一个工具集,支持1. SQL 指纹(sql fingerprint);2. 数据库库表对比(sql diff): 对比两个数据库的库表差异,并生成源库到目标库对应的差异( DDL) 语句。
https://github.com/sjjian/sql-calculator
ddl diff fingerprint migrate mysql tools
Last synced: about 1 month ago
JSON representation
这是一个基于 TiDB MySQL 语法解析器的一个工具集,支持1. SQL 指纹(sql fingerprint);2. 数据库库表对比(sql diff): 对比两个数据库的库表差异,并生成源库到目标库对应的差异( DDL) 语句。
- Host: GitHub
- URL: https://github.com/sjjian/sql-calculator
- Owner: sjjian
- License: apache-2.0
- Created: 2020-11-15T08:34:19.000Z (about 4 years ago)
- Default Branch: main
- Last Pushed: 2022-07-13T11:08:46.000Z (over 2 years ago)
- Last Synced: 2023-03-05T14:50:41.001Z (over 1 year ago)
- Topics: ddl, diff, fingerprint, migrate, mysql, tools
- Language: Go
- Homepage:
- Size: 4.58 MB
- Stars: 11
- Watchers: 1
- Forks: 8
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# sql-calculator
这是一个基于 TiDB MySQL 语法解析器的一个工具集,目前提供以下功能
1. SQL 指纹
1. 数据库库表对比: 对比两个数据库的库表差异,并生成源库到目标库对应的差异( DDL) 语句
## 编译
```
git clone https://github.com/sjjian/sql-calculator
cd sql-calculator
go build -mod vendor
```
## SQL 指纹
指定 SQL 生成 SQL 指纹,支持子查询
### 1. 使用方式
```bash
>> ./sql-calculator fp --help
SQL Fingerprint - Replace all expression value of the SQL with ?Usage:
fp [SQL content](string) [flags]Examples:
./sql-calculator fp "update tb1 set a = "2" where a = "3" and b = 4Output:
UPDATE `tb1` SET `a`=? WHERE `a`=? AND `b`=?Flags:
-h, --help help for fp```
### 2. 与 SOAR 对比
SOAR(https://github.com/XiaoMi/soar/blob/dev/cmd/soar/soar.go) 使用的是 percona 的 fingerprint (https://github.com/percona/go-mysql/blob/master/query/query.go#L151) 这个库是基于字符串匹配,无法处理子查询的情况。相比来说基于词法解析的方式实现能够支持更复杂的语句。
## 数据库库表对比
### 1. 支持
* 表:增,删
* 字段: 增,删,改
## virtual db
模拟数据库的 ddl 执行得到数据库结构
```go
vb := NewVirtualDB("")
vb.ExecSQL("create database db1")
vb.ExecSQL("use db1")
vb.ExecSQL("create table t1(id int)")
vb.ExecSQL("alter table db1.t1 add column name varchar(255);")vb.Text()
/*
output:
CREATE DATABASE `db1`;
CREATE TABLE `db1`.`t1` (`id` INT,`name` VARCHAR(255));
*/
```