sqler 從開源很快就獲取了1k的star,使用起來很方便,而且也很靈活,支持的數據庫也比較多。
支持的功能
- 無需依賴,可獨立使用;
- 支持多種數據可類型,包括:SQL Server, MYSQL, SQLITE, PostgreSQL, Cockroachdb 等;
- 內置 RESTful 服務器;
- 內置 RESP Redis 協議,可以使用任何 redis 客戶端連接到 SQLer;
- 內置 Javascript 解釋器,可輕松轉換結果;
- 內置驗證器;
- 自動使用預備語句;
- 使用(HCL)配置語言;
- 可基於 unix glob 模式加載多個配置文件;
- 每條 SQL 查詢可被命名為宏;
- 在每個宏內可使用 Go text/template;
- 每個宏都有自己的 Context(查詢參數 + 正文參數)作為.Input(map [string] interface{}),而.Utils是輔助函數列表,目前它只包含 SQLEscape;
- 可自定義授權程序,授權程序只是一個簡單的 webhook,sqler 使用這個 webhook 驗證是否應該完成某請求
測試環境准備
為了方便測試,我制作了一個比較簡單的docker 鏡像dalongrong/sqler:1.5,對於運行的參數可以通過環境
變量指定
- docker-compose 文件
version: "3"
services:
sqler:
image: dalongrong/sqler:1.5
environment:
- "DSN=root:dalongrong@tcp(mysqldb:3306)/test?multiStatements=true"
ports:
- "3678:3678"
- "8025:8025"
mysqldb:
image: mysql:5.7.16
ports:
- 3306:3306
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: dalongrong
MYSQL_DATABASE: test
MYSQL_USER: test
MYSQL_PASSWORD: test
TZ: Asia/Shanghai
- 說明
鏡像dalongrong/sqler:1.5 包含一個默認的配置,也可以通過環境指定,配置內容來自官方
內容如下:
// create a macro/endpoint called "_boot",
// this macro is private "used within other macros"
// because it starts with "_".
_boot {
// the query we want to execute
exec = <<SQL
CREATE TABLE IF NOT EXISTS `users` (
`ID` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(30) DEFAULT "@anonymous",
`email` VARCHAR(30) DEFAULT "@anonymous",
`password` VARCHAR(200) DEFAULT "",
`time` INT UNSIGNED
);
SQL
}
// adduser macro/endpoint, just hit `/adduser` with
// a `?user_name=&user_email=` or json `POST` request
// with the same fields.
adduser {
// what request method will this macro be called
// default: ["ANY"]
methods = ["POST"]
// authorizers,
// sqler will attempt to send the incoming authorization header
// to the provided endpoint(s) as `Authorization`,
// each endpoint MUST return `200 OK` so sqler can continue, other wise,
// sqler will break the request and return back the client with the error occured.
// each authorizer has a method and a url, if you ignored the method
// it will be automatically set to `GET`.
// authorizers = ["GET http://web.hook/api/authorize", "GET http://web.hook/api/allowed?roles=admin,root,super_admin"]
// the validation rules
// you can specifiy seprated rules for each request method!
rules {
user_name = ["required"]
user_email = ["required", "email"]
user_password = ["required", "stringlength: 5,50"]
}
// the query to be executed
exec = <<SQL
{{ template "_boot" }}
/* let's bind a vars to be used within our internal prepared statment */
{{ .BindVar "name" .Input.user_name }}
{{ .BindVar "email" .Input.user_email }}
{{ .BindVar "emailx" .Input.user_email }}
INSERT INTO users(name, email, password, time) VALUES(
/* we added it above */
:name,
/* we added it above */
:email,
/* it will be secured anyway because it is encoded */
'{{ .Input.user_password | .Hash "bcrypt" }}',
/* generate a unix timestamp "seconds" */
{{ .UnixTime }}
);
SELECT * FROM users WHERE id = LAST_INSERT_ID();
SQL
}
// list all databases, and run a transformer function
databases {
exec = "SHOW DATABASES"
transformer = <<JS
// there is a global variable called `$result`,
// `$result` holds the result of the sql execution.
(function(){
newResult = []
for ( i in $result ) {
newResult.push($result[i].Database)
}
return newResult
})()
JS
}
運行&&測試
- 運行
docker-compose up -d
- 添加數據
rest 接口地址為8025
添加數據curl 命令
curl -X POST \
http://localhost:8025/adduser \
-H 'Content-Type: application/json' \
-H 'Postman-Token: a7784ea1-9f50-46ee-92ac-1d850334f3f1' \
-H 'cache-control: no-cache' \
-d '{
"user_name":"dalong",
"user_email":"1141591465@qq.com",
"user_password":"dalongdemo"
}'
返回結果
{
"data": [
{
"ID": 1,
"email": "1141591465@qq.com",
"name": "dalong",
"password": "$2a$10$nfPllaq3AqYDwu4SQTskWeN0BphHCoBzwmb4rj6Q0OB21voBHCZke",
"time": 1547127497
}
],
"success": true
}
數據庫數據
說明
sqler 的設計很方便,我們通過簡單的配置就可以創建靈活的rest api 了,很強大,而且內置的認證處理,數據校驗。。。
參考資料
https://www.infoq.cn/article/LZxqJd-ZcNiUKcG1APDz
https://github.com/alash3al/sqler
https://github.com/rongfengliang/sqler-docker-compose