SQL处理 sql转proto
⎯⎯ 不必行色匆匆,不必光芒四射,不必成为别人,只需做自己。下午好。

sql转proto

 5302  |   | 


Select
     
说 明

sql转proto



功能介绍

1.支持多种数据库的建表 sql转proto, 其中包含(pg、oracle、mysql)等数据库; 建表语句, 建表语句, 建表语句(重要的说3遍)
2.在转换 sql 的时候, 需要确认下是否需要切换处理类型, 暂时支持3种处理方式(normal, postgresql, oracle), 默认: normal.
说明: 不能在 sql 中包含注释内容(即: -- xxx# xxx); 由于此工具是通过 ; 来分割语句处理. 所有 normal 状态下可以同时处理多个建表语句; postgresqloracle 由于需要解析注释, 只支持单个建表语句.
3.支持自定义过滤不需要的字段, 多个字段通过 , 隔开



示例

mysql 建表语句

CREATE TABLE if not exists user (
  id int NOT NULL AUTO_INCREMENT,
  name varchar(10) NOT NULL COMMENT '姓名',
  gender tinyint NOT NULL DEFAULT 0 COMMENT '性别 0-未知 1-男 2-女',
  age int NOT NULL COMMENT '年龄',
  created_date datetime DEFAULT CURRENT_TIMESTAMP,
  updated_date datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
);

处理后

message UserInfo {
  int32 id = 1;
  string name = 2; // 姓名
  int32 gender = 3; // 性别 0-未知 1-男 2-女
  int32 age = 4; // 年龄
  string created_date = 5;
  string updated_date = 6;
}

pgsql 建表语句

CREATE TABLE if not exists user (
  id character varying(32) NOT NULL DEFAULT sys_guid(),
  name character varying(10) NOT NULL,
  gender tinyint NOT NULL,
  age tinyint NOT NULL,
  created_date timestamp without time zone DEFAULT now(),
  updated_date timestamp without time zone DEFAULT now(),
  CONSTRAINT user_pkey PRIMARY KEY (id)
);
COMMENT ON TABLE user IS '用户表';
COMMENT ON COLUMN user.id IS '主键';
COMMENT ON COLUMN user.name IS '姓名';
COMMENT ON COLUMN user.gender IS '性别 0-未知 1-男 2-女';
COMMENT ON COLUMN user.age IS '年龄';
COMMENT ON COLUMN user.created_date IS '创建时间';
COMMENT ON COLUMN user.updated_date IS '更新时间';

处理后

message UserInfo {
  int32 id = 1;
  string name = 2; // 姓名
  int32 gender = 3; // 性别 0-未知 1-男 2-女
  int32 age = 4; // 年龄
  string created_date = 5;
  string updated_date = 6;
}

oracle 建表语句

CREATE TABLE if not exists user (
  id character varying(32) NOT NULL DEFAULT sys_guid(),
  name character varying(10) NOT NULL,
  gender tinyint NOT NULL,
  age tinyint NOT NULL,
  created_date date default sysdate,,
  updated_date date default sysdate,,
  CONSTRAINT user_pkey PRIMARY KEY (id)
);
COMMENT ON TABLE user IS '用户表';
COMMENT ON COLUMN user.id IS '主键';
COMMENT ON COLUMN user.name IS '姓名';
COMMENT ON COLUMN user.gender IS '性别 0-未知 1-男 2-女';
COMMENT ON COLUMN user.age IS '年龄';
COMMENT ON COLUMN user.created_date IS '创建时间';
COMMENT ON COLUMN user.updated_date IS '更新时间';

处理后

message UserInfo {
  int32 id = 1;
  string name = 2; // 姓名
  int32 gender = 3; // 性别 0-未知 1-男 2-女
  int32 age = 4; // 年龄
  string created_date = 5;
  string updated_date = 6;
}


自荐 另类 proto 验证器



项目背景

1.在 protobuf 方面验证器常用的为 go-proto-validators 验证器, 使用方面个人认为较为繁琐,代码量比较多, 使用如下:

syntax = "proto3";
package validator.examples;
import "github.com/mwitkow/go-proto-validators/validator.proto";

message InnerMessage {
    // some_integer can only be in range (0, 100).
    int32 some_integer = 1 [(validator.field) = {int_gt: 0, int_lt: 100}];
    // some_float can only be in range (0;1).
    double some_float = 2 [(validator.field) = {float_gte: 0, float_lte: 1}];
}

2.本验证器, 相同功能使用如下:

syntax = "proto3";
package examples;

message InnerMessage {
    // some_integer can only be in range (0, 100).
    int32 some_integer = 1; // @tag oto=0~100
    // some_float can only be in range (0;1).
    double some_float = 2; // @tag oto=0~1
}


原理介绍

1.通过对 xxx.proto 通过注释的形式加入验证 tag, 然后再使用 inject_tool.sh xxx.proto 编译, 这样生成的 xxx.pb.go 文件中的 struct 注入自定义的 tag

2.通过验证器对 struct 中的 tag 进行验证



验证器介绍

1.支持对 一个或多个struct, 会一次性根据对 struct 设置的规则进行验证(包含嵌套验证), 将最终的所有错误都返回

2.支持对 单个变量 的验证, 变量可以为切片/数组/单个[int系列, float系列, bool系列, string系列]进行验证

3.支持对 query url 的验证

4.支持 map[string]interface{} 的验证

5.易于自定义错误信息, 易于自定义验证方法





最后

欢迎大佬们指正, 同时也希望大佬给 star
gitee: to
github: to