首页 > 其他分享 >尝试让查询更简单Rf

尝试让查询更简单Rf

时间:2024-09-29 14:04:02浏览次数:6  
标签:尝试 body name age 查询 Rf query example string

为什么要写

为什么要写,大概就是沉没成本吧

只是从Source Generators出来开始,就打算以其研究是否能做 aop (现在已经有内置功能了),本来当年就想尝试能否在 orm 做一些尝试,可惜种种原因,自己都忘了这个打算了

直到今年7月份,才又想起了这个打算,现在精力不行了,本来研究一下原理和功能限制也算完了,

可是都写了蛮久了,不写完整点,感觉有点浪费,又花了不少时间才把 类似 DapperAOT 功能做的差不多

写完了又觉得光复制复制功能 没意思, 所以又把以前为了在公司内少写一些比较重复性代码做的 查询定制功能 在 sv.db 基础上搞一把, 反正成本已经花了那么多了

虽然这也不算多大创新, 类似想法老早就不少人搞了,比如最夸张的 graphql 这一套甚至让大家的基础设施都得搭一套,

不过越搞越多,都到国庆了,目前还只能算主体完成了,细节还有很多没搞

很多转换 解析都是手写的,不是因为写的nb,只是引入其他库兼容可能有点麻烦,场景不多,递归遍历就够了

nuget 什么的也没空搞了,bug 估计不少,等后面再完整点再搞,反正都是自娱自乐

真是年纪大了,做什么都越来越慢了

sv.db 能做什么

1. db映射到实体

DapperAOT 一样,使用 Source Generators:westworld加速 在构建期间生成必要的代码,以帮助您更轻松地使用 sql。

理论上,您还可以进行 Native AOT 部署

其实没什么,举个栗子吧

public async Task<object> OldWay()
{
    var a = factory.GetConnection(StaticInfo.Demo);
    using var dd = await a.ExecuteReaderAsync("""
SELECT count(1)
FROM Weather;
SELECT *
FROM Weather;
""");
    var t = await dd.QueryFirstOrDefaultAsync<int>();
    var r = await dd.QueryAsync<string>().ToListAsync();
    return new { TotalCount = t, Rows = r };
}

2. 让查询编码简单,并支持更复杂的条件

通过定义一些简单的查询规则,我们可以将 查询转换为 db / api / es 查询语句 ....

目前只搞了 db 转换,并且还没空完整适配测试, es 、mongodb 什么等后面有空把

不过理论上,我们可以这样做:

http query string / body  |------>  select statement    |------>  db (sqlite / mysql/ sqlserver / PostgreSQL)
Expression code           |------>                      |------>  es
                                                        |------>  mongodb
                                                        |------>  more .....

中间 select statement 这一层已经定义好了,前面的转换也有了, 后面的理论加上适配,什么都可以做,

2.1 举个 api 的栗子

Code exmples:

首先定义一个 实体配置, 列明哪些字段可以查,可以排序,可以筛选

[Db("Demo")]
[Table(nameof(Weather))]
public class Weather
{ 
 [Select, Where, OrderBy]
 public string Name { get; set; }

 [Select(Field = "Value as v"), Where, OrderBy]
 public string V { get; set; }

 [Select(NotAllow = true)]
 public string Test { get; set; }
}

然后定义 查询接口

[HttpGet] 
public async Task<object> Selects() //  你可以自己做一些字段,授权检查 [FromQuery, Required] string name) 
{
    return await this.QueryByParamsAsync();
}

接着你就可以让用户自己拼写各种条件,让她们自己满足自己的场景,这样自己可以多摸一会鱼了

curl --location 'http://localhost:5259/weather?where=not (name like '%e%')&TotalCount=true'

Response

{
    "totalCount": 1,
    "rows": [
        {
            "name": "H",
            "v": "mery!"
        }
    ]
}

2.2 同样可以让查询代码更简单
Code exmples:

其实很多 orm 都提供用Expression 达到类似或更复杂效果的

这里考虑工作量,restful api 和其他数据查询实现 支持度不一,目前只做基础filter 支持, join 什么都不搞了,就算搞了多半又会被骂,直接写sql 不更好吗?

比如下面 query Weather which name no Contains 'e'

public async Task<object> DoSelects()
{
    return await factory.ExecuteQueryAsync(From.Of().Where(i => !i.Name.Like("e")).WithTotalCount());
}


这里就非常简单介绍一下,复杂的,怎么实现的不写,累了,写不动了,要有感兴趣的 可以在 gayhub 看源码 https://github.com/fs7744/sv.db

下面再列举一下过滤操作符支持情况

Query in api

Both has func support use query string or body to query

body or query string will map to Dictionary to handle

operater

such filter operater just make api more restful (Where=urlencode(complex condition) will be more better)

  • {{nl}} is null
    • query string ?name={{nl}}
    • body {"name":"{{nl}}"}
  • {{eq}} Equal =
    • query string ?name=xxx
    • body {"name":"xxx"}
  • {{lt}} LessThan or Equal <=
    • query string ?age={{lt}}30
    • body {"age":"{{lt}}30"}
  • {{le}} LessThan <
    • query string ?age={{le}}30
    • body {"age":"{{le}}30"}
  • {{gt}} GreaterThan or Equal >=
    • query string ?age={{gt}}30
    • body {"age":"{{gt}}30"}
  • {{gr}} GreaterThan >
    • query string ?age={{gr}}30
    • body {"age":"{{gr}}30"}
  • {{nq}} Not Equal !=
    • query string ?age={{nq}}30
    • body {"age":"{{nq}}30"}
  • {{lk}} Prefix Like 'e%'
    • query string ?name={{lk}}e
    • body {"name":"{{lk}}e"}
  • {{rk}} Suffix Like '%e'
    • query string ?name={{rk}}e
    • body {"name":"{{rk}}e"}
  • {{kk}} Like '%e%'
    • query string ?name={{kk}}e
    • body {"name":"{{kk}}e"}
  • {{in}} in array (bool/number/string)
    • query string ?name={{in}}[true,false]
    • body {"name":"{{in}}[\"s\",\"sky\"]"}
  • {{no}} not
    • query string ?age={{no}}{{lt}}30
    • body {"age":"{{no}}{{lt}}30"}

Func Fields:

  • Fields return some Fields , no Fields or Fields=* is return all
    • query string ?Fields=name,age
    • body {"Fields":"name,age"}
  • TotalCount return total count
    • query string ?TotalCount=true
    • body {"TotalCount":"true"}
  • NoRows no return rows
    • query string ?NoRows=true
    • body {"NoRows":"true"}
  • Offset Offset Rows index
    • query string ?Offset=10
    • body {"Offset":10}
  • Rows Take Rows count, default is 10
    • query string ?Rows=100
    • body {"Rows":100}
  • OrderBy sort result
    • query string ?OrderBy=name:asc,age:desc
    • body {"OrderBy":"name:asc,age:desc"}
  • Where complex condition filter
    • query string ?Where=urlencode( not(name like 'H%') or name like '%v%' )
    • body {"Where":"not(name like 'H%') or name like '%v%'"}
    • operaters
      • bool
        • example true or false
      • number
        • example 12323 or 1.324 or -44.4
      • string
        • example 'sdsdfa' or 'sds\'dfa' or "dsdsdsd" or "fs\"dsf"
      • = null is null
        • example name = null
      • = Equal
        • example name = 'sky'
      • <= LessThan or Equal
        • example age <= 30
      • < LessThan
        • example age < 30
      • >= GreaterThan or Equal
        • example age >= 30
      • > GreaterThan
        • example age > 30
      • != Not Equal
        • example age != 30
      • like 'e%' Prefix Like
        • example name like 'xx%'
      • like '%e' Suffix Like
        • example name like '%xx'
      • like '%e%' Like
        • example name like '%xx%'
      • in () in array (bool/number/string)
        • example in (1,2,3) or in ('sdsdfa','sdfa') or in (true,false)
      • not
        • example not( age <= 30 )
      • and
        • example age <= 30 and age > 60
      • or
        • example age <= 30 or age > 60
      • ()
        • example (age <= 30 or age > 60) and name = 'killer'

标签:尝试,body,name,age,查询,Rf,query,example,string
From: https://www.cnblogs.com/westworldss/p/18439580

相关文章

  • mysql数据库多表查询
    单表查询1、普通查询(1)命令:select*from<表名>;//通匹(2)命令:select<要查询的字段>from<表名>;2、去重查询(distinct)命令:selectdistinct<要查询的字段>from<表名>3、排序查询(orderby)升序:asc降序:desc降序排列命令:select<要查询的字段名>from<表名>orderby<要查......
  • Swoole之Hyperf框架的迁移和填充
    hyperf框架的orm其实就是基于laravel改造的。会laravel就会hyperf,只不过目前为止hyperf的文档都没有填充相关的。生成迁移文件,这点文档有,具体可以参考文档https://hyperf.wiki/3.1/#/zh-cn/db/migrationphpbin/hyperf.phpgen:migrationcreate_users_table修改migrations......
  • Linux便捷查询使用手册 第七章:软件包管理
    目录7.1软件包管理的基本概念7.1.1什么是软件包?7.1.2包管理器的类型7.2常用命令7.2.1Debian/Ubuntu系列1.apt命令2.dpkg命令7.2.2RedHat/CentOS系列1.yum命令2.dnf命令7.2.3通用命令1.rpm命令(适用于RedHat系列)7.3软件源管理7.3.1软件源的概念7.......
  • MyBatis-Plus分页查询
    在实际开发中,对于大量数据的查询,可以通过分页查询的方式来减少查询量和提高查询效率。在MyBatis-Plus中,分页查询可以通过使用Page对象和IService接口提供的分页方法来实现。MyBatis-Plus的分页插件PaginationInnerInterceptor提供了强大的分页功能,支持多种数据库,使得......
  • 谷歌网站收录查询,你知道怎么查询谷歌网站的收录情况吗
    查询谷歌网站的收录情况,可以通过以下几种方法来实现:一、使用GoogleSearchConsole(谷歌搜索控制台)GoogleSearchConsole是谷歌提供的官方工具,用于监控和管理网站在谷歌搜索结果中的表现。以下是具体步骤:访问并登录:访问GoogleSearchConsole官网,并使用谷歌账户登录。添加并......
  • 谷歌收录批量查询,你知道怎么批量查询谷歌收录
    批量查询谷歌收录是一个涉及多个步骤和工具的过程,旨在帮助网站管理员或SEO专业人士快速了解多个网站或页面在谷歌搜索引擎中的收录情况。以下是一些常用的批量查询谷歌收录的方法和步骤:一、使用GoogleSearchConsole(谷歌搜索控制台)虽然GoogleSearchConsole本身不直接支持批......
  • sql查询一对多关系中对应的多个值都在某集合中的值
    例如找到所有选的课都在课程表中的学生。假如课程表中所有课的集合为cs,学生的表为stu,stu.id是学生姓名,stu.c是学生选的课。思路:不存在某门课不在课程表中。selectidfrom( selectDISTINCTid fromstu)idswherenotexists( selectc fromstu wherecnotin(sel......
  • 气象水文耦合模WRF-Hydro建模——建议收藏!
    原文链接:气象水文耦合模WRF-Hydro建模https://mp.weixin.qq.com/s?__biz=MzUzNTczMDMxMg==&mid=2247619667&idx=5&sn=d3745f6154c1d7f6e941c0618b77e6f8&chksm=fa8255b4cdf5dca216ba8f3acea073f88438ab4e93b4320f6c71a48259e43f235cb1ccdb7dda&token=872080900&la......
  • XSS攻击和CSRF攻击
    一、XSSXSS,即跨站脚本攻击。是值攻击者在网站上注入恶意的客户端代码,通过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据的一种攻击方式。比如在论坛上或者输入框内输入"<alert>document.cookie</alert>"就可以拿到用户的cookie了......
  • csrf问题
    用ajax如下/***根据cookie的name获取对应的值*@paramname*@returns{null}*/functiongetCookie(name){letcookieValue=null;if(document.cookie&&document.cookie!==''){constcookies=document.cookie.split(';�......