首页 > 其他分享 >Fast ORM 读写分离功能使用

Fast ORM 读写分离功能使用

时间:2023-12-06 15:37:15浏览次数:32  
标签:p2 p1 读写 db Fast ORM Query CategoryId SELECT

Fast Framework

作者 Mr-zhong

代码改变世界....

一、前言

Fast Framework 基于NET6.0 封装的轻量级 ORM 框架 支持多种数据库 SqlServer Oracle MySql PostgreSql Sqlite

优点: 体积小、原生支持微软特性、流畅API、使用简单、性能高、模型数据绑定采用 Expression、强大的表达式解析、支持多种子查询可实现较为复杂查询、源代码可读性强、支持AOT 编译。

缺点:目前仅支持Db Frist

开源地址:https://github.com/China-Mr-zhong/Fast.Framework (唯一)

ps:权重随机算法、支持故障转移、故障回调(可做日志记录或通知)

一、appsettings.json 配置

{
    "DbOptions": [
        {
            "DbId": "db_01",
            "DbType": "MySQL",
            "IsDefault": true,
            "ConnectionStrings": "server=localhost;database=Test;user=root;pwd=123456789;port=3306;min pool size=0;max pool size=100;connect timeout=120;AllowLoadLocalInfile=true;",
            "UseMasterSlaveSeparation": true, //使用主从分离 注意所有事务将强制走主库
            "SlaveItems": [
                {
                    "DbId": "A",
                    "Weight": 60,
                    "ConnectionStrings": "server=localhost;database=Test1;user=root;pwd=123456789;port=3306;min pool size=0;max pool size=100;connect timeout=120;AllowLoadLocalInfile=true;",
                    "Description": "A数据库"
                },
                {
                    "DbId": "B",
                    "Weight": 40,
                    "ConnectionStrings": "server=localhost;database=Test2;user=root;pwd=123456789;port=3306;min pool size=0;max pool size=100;connect timeout=120;AllowLoadLocalInfile=true;",
                    "Description": "B数据库"
                }
            ],
            "Description": "主库连接配置"
        }
    ]
}

二、 Program (入口配置)

            builder.Services.Configure<List<DbOptions>>(builder.Configuration.GetSection("DbOptions"));//注册Options接口
            builder.Services.AddFastDbContext();//添加上下文

四、使用示例

                db.Aop.SlaveDbFault = (options, ex) =>
                {
                    //故障回调
                    Console.WriteLine($"从库ID:{options.DbId} 发生故障!!! 异常信息:{ex.Message}");
                };

                var data = db.Query<Product>().First();

                Console.WriteLine(Json.Serialize(data));
                Console.WriteLine();
                Console.WriteLine($"从库索引:{db.Ado.CurrentSlaveDbIndex} 从库ID:{db.Ado.SlaveDbOptions.DbId}");

其它很棒的功能(原创基于作用域概念设计的子查询)

  • Join子查询

    • 示例代码

                      var subQuery1 = db.Query<Product>().Select(s => new
                      {
                          s.ProductId,
                          s.CategoryId,
                          s.ProductCode,
                          s.ProductName,
                          s.DeleteMark
                      });
                      var data = db.Query<Category>().InnerJoin(subQuery1, (a, b) => a.CategoryId == b.CategoryId).ToList();
      
    • 执行后Sql

      SELECT p1.`CategoryId`,p1.`CategoryName`,p2.`ProductId`,p2.`ProductCode`,p2.`ProductName`,p2.`DeleteMark` FROM `Category` `p1`
      INNER JOIN ( SELECT `ProductId` AS `ProductId`,`CategoryId` AS `CategoryId`,`ProductCode` AS `ProductCode`,`ProductName` AS `ProductName`,`DeleteMark` AS `DeleteMark` FROM `Product` ) `p2` ON ( `p1`.`CategoryId` = `p2`.`CategoryId` )
      
  • From子查询

    • 示例代码

                      var subQuery2 = db.Query<Product>().Select(s=>new
                      {
                          s.ProductId,
                          s.CategoryId,
                          s.ProductCode,
                          s.ProductName,
                          s.DeleteMark
                      });
                      var data = db.Query(subQuery2).ToList();
      
    • 执行后Sql

      SELECT * FROM ( SELECT `ProductId` AS `ProductId`,`CategoryId` AS `CategoryId`,`ProductCode` AS `ProductCode`,`ProductName` AS `ProductName`,`DeleteMark` AS `DeleteMark` FROM `Product` ) x
      
  • Select子查询

    • 示例代码

                      var data = db.Query<Product>().Select(s => new
                      {
                          CategoryName = db.Query<Category>().Where(w => w.CategoryId == 1).Select(s => s.CategoryName).First()
                      }).First();
      
    • 执行后Sql

      SELECT ( SELECT `p2`.`CategoryName` FROM `Category` `p2`
      WHERE ( `p2`.`CategoryId` = 1 ) Limit 1 ) AS `CategoryName` FROM `Product` `p1` Limit 1
      
  • Select嵌套查询

    • 示例代码

                      var data1 = db.Query<Product>().Select(s => new
                      {
                          NestedQuery = db.Query<Category>().Where(w => w.CategoryId == s.CategoryId).ToList()
                      }).First();
      
                      var data2 = db.Query<Product>().Where(w => w.ProductId == 1).Select(s => new
                      {
                          NestedQuery = db.Query<Category>().Where(w => w.CategoryId == s.CategoryId).ToList()
                      }).First();
      
    • 执行后Sql

      //内部机制主查询有结果才执行嵌套查询,懒加载实现
      
      SELECT 0 AS `fast_args_index_0` FROM `Product` `p1` Limit 1
      
      --------------------------------------------------------------------------
      
      SELECT p2.`CategoryId`,p2.`CategoryName`,p1.`ProductId`,p1.`ProductCode`,p1.`ProductName`,p1.`DeleteMark`,p1.`CreateTime`,p1.`ModifyTime`,p1.`Custom1`,p1.`Custom2`,p1.`Custom3`,p1.`Custom4`,p1.`Custom5`,p1.`Custom6`,p1.`Custom7`,p1.`Custom8`,p1.`Custom9`,p1.`Custom10`,p1.`Custom11`,p1.`Custom12` FROM `Category` `p2`
      RIGHT JOIN `Product` `p1` ON ( `p2`.`CategoryId` = `p1`.`CategoryId` )
      
      SELECT 0 AS `fast_args_index_0` FROM `Product` `p1`
      WHERE ( `p1`.`ProductId` = 1 ) Limit 1
      
  • Where子查询

    • 示例代码

                      var data = db.Query<Category>().Where(w => w.CategoryId == 1 && db.Query<Product>().Where(w => w.CategoryId == 1).Select(s => 1).Any()).First();//Any支持取反
      
    • 执行后Sql

      SELECT p1.`CategoryId`,p1.`CategoryName` FROM `Category` `p1`
      WHERE ( ( `p1`.`CategoryId` = 1 ) AND EXISTS ( SELECT 1 FROM `Product` `p2`
      WHERE ( `p2`.`CategoryId` = 1 ) ) ) Limit 1
      

更多示例 https://www.cnblogs.com/China-Mr-zhong/p/17852177.html

标签:p2,p1,读写,db,Fast,ORM,Query,CategoryId,SELECT
From: https://www.cnblogs.com/China-Mr-zhong/p/17879642.html

相关文章

  • fastapi的两种启动方式
     代码文件中启动if__name__=='__main__':uvicorn.run('test:app')#其中test为当前py文件,app为FastAPI的实例对象,这样启动默认为http://127.0.0.1:8000,可自行配置host,port,workers,reload等参数。终端启动#cd到启动文件同目录#终端执行uvicorntest:app--reloa......
  • 大语言模型底层架构丨带你认识Transformer
    本文分享自华为云社区《大语言模型底层架构你了解多少?大语言模型底层架构之一Transfomer的介绍和python代码实现》,作者:码上开花_Lancer。语言模型目标是建模自然语言的概率分布,在自然语言处理研究中具有重要的作用,是自然语言处理基础任务之一。大量的研究从n元语言模型(n-gram......
  • Flask ORM 学习笔记Part06:marshmallow的使用(下)
    前两篇学习笔记中讲了schema字段,验证器等。这篇就是Marshmallow在ORM中用的比较多的dump与load操作。dumploadMarshmallow提供了两个主要的方法:dump和load。dump:将Python对象转换为JSON、XML等格式。它将接受一个Python对象作为输入,并返回一个字符串或字节流,表示该对象......
  • Unity Transform接口的几个常用方法解析_unity基础开发教程
    UnityTransform接口常用方法解析1.Transform.position2.Transform.right、Transform.forward、Transform.up3.Transform.Rotate4.Transform.Translate在Unity中,Transform类是游戏对象位置、旋转和缩放的表示。在日常开发中我们回经常用到Transform接口的几个常用方法,这些方......
  • DevExpress WinForms Pivot Grid组件,一个类似Excel的数据透视表控件(一)
    界面控件DevExpressWinForms的PivotGrid组件是一个类似Excel的数据透视表控件,用于多维(OLAP)数据分析和跨选项卡报表。众多的布局自定义选项使您可以完全控制其UI,无与伦比的以用户为中心的功能使其易于部署。DevExpressWinForms有180+组件和UI库,能为WindowsForms平台创建具有......
  • DjangoORM语法
    ORM语法-配置django中与数据库映射的关系,不需要写原始sql语句,而是定义模型类,操作模型完成对数据库进行增删改查等操作。o指类对象的意思r指数据库表的意思m指映射的意思orm的优点数据库模型定义在一个地方,方便维护orm有现成的工具,很多功能自动完成,比如数据库消除,预处......
  • orm打印原生sql语句方法
    方式一:使用print打印时在queryset对象后使用.querybook_qs=models.Book.objects.filter(pk=1).values('publish__name','title')print(book_qs.query)book_qs=models.Book.objects.filter(pk=1).values('publish__name','title')print......
  • 控制文件读写内容的模式
    控制文本读写格式t(默认的):文本模式读写都是以字符串的为单位的只能针对文本文件必须加入encoding参数b:二进制模式读写文件都是以bytes/二进制为单位可以针对所有的文件不可以加入encoding参数前提:b/t模式都不能单独使用,必须与r/w/a之一结合使用。(1)t模......
  • 控制文本读写内容的模式
    控制文本读写格式t(默认的):文本模式读写都是以字符串的为单位的只能针对文本文件必须加入encoding参数b:二进制模式读写文件都是以bytes/二进制为单位可以针对所有的文件不可以加入encoding参数前提:b/t模式都不能单独使用,必须与r/w/a之一结合使用。(1)t模......
  • HTML学习笔记五:html-body-form表单
    HTML学习笔记五:html-body-form表单MDN元素查询地址所有的html的元素我们都可以通过以下地址进行相关的查询和理解。https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/meta表单元素在网页中,如果需要向web服务器提交用户输入的信息时候,需要用到form表单进行提交。......