sqler sql 轉rest api 的工具試用


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM