讓查詢可以使用 json path

victor.x.qu發表於2024-10-14

記錄一下最近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" />

相關文章