記錄一下最近sv.db的完善
1. 讓查詢可以使用 json path
有時候我們會儲存 json 到 db,也有時會只取json部分資料,或者透過json部分資料進行過濾
所以sv.db 也支援這些場景,(目前只有 db 實現,json的操作都是依靠db json 函式)
舉例:
資料
a.ExecuteNonQuery("""
INSERT INTO Weather
(name, value)
VALUES ('Hello', '{"a":2}'),('A', '{"a":3,"c":[4,5,{"f":7}]}')
""");
然後配置欄位允許json
[Db(StaticInfo.Demo)]
[Table(nameof(Weather))]
public class Weather
{
[Select, Where, OrderBy]
public string Name { get; set; }
[Select(Field = "Value"), Where, OrderBy, Column(IsJson = true)]
public string V { get; set; }
}
api 方法不用做額外的實現
[HttpGet]
public async Task<object> Selects()
{
return await this.QueryByParamsAsync<Weather>();
}
使用者查詢api 時就可以對json欄位進行任意操作,比如
curl --location 'http://localhost:5259/weather?Fields=v,json(v,'$.a',vvva)&OrderBy=json(v,'$.a') asc&Where=json(v,'$.a') != 1'
結果
{
"totalCount": null,
"rows": [
{
"vvva": 2,
"v": "{\"a\":2}"
},
{
"vvva": 3,
"v": "{\"a\":3,\"c\":[4,5,{\"f\":7}]}"
}
]
}
ps:json 實現對應 db json 函式
db | json 函式 |
---|---|
SQLite | json_extract |
PostgreSQL | jsonb_path_query_first |
MySql | json_unquote(json_extract()) |
sql server | JSON_QUERY |
2. 欄位白名單驗證
預設會對解析的statement結果進行欄位驗證,不透過的會返回 400
驗證:
- 不在欄位配置的白名單範圍
- 不允許類似 1 = 1, 只能 field = 1
- 未配置 json 欄位不允許使用 json 函式
如需改變 驗證邏輯或自行驗證,可以透過 SelectStatementOptions
自行處理
public record class SelectStatementOptions
{
public bool AllowNotFoundFields { get; init; } = false;
public bool AllowNonStrictCondition { get; init; } = false;
public Action<Statement> Visiter { get; init; } = null;
}
3. swagger 生成
安裝 swagger
<PackageReference Include="SV.Db.Sloth.Swagger" Version="0.0.2.3" />
swagger gen 配置 sv.db 方法
builder.Services.AddSwaggerGen(c =>
{
c.AddDbSwagger();
});
api 方法配置 swagger
[DbSwaggerByType(typeof(Weather))]
[HttpGet]
public async Task<object> Selects()
{
return await this.QueryByParamsAsync<Weather>();
}
只需配置這些,swagger 將為大家自動生成欄位描述
4. 主要功能已完善,已釋出 nuget
如想嘗試,只需安裝所需 package
<PackageReference Include="SV.Db.Sloth.Swagger" Version="0.0.2.3" />
<PackageReference Include="SV.Db.Sloth.WebApi" Version="0.0.2.3" />
<PackageReference Include="SV.Db.Analyzers" Version="0.0.2.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="SV.Db.Sloth.MSSql" Version="0.0.2.3" />
<PackageReference Include="SV.Db.Sloth.MySql" Version="0.0.2.3" />
<PackageReference Include="SV.Db.Sloth.PostgreSQL" Version="0.0.2.3" />
<PackageReference Include="SV.Db.Sloth.Sqlite" Version="0.0.2.3" />