- 博客(48)
- 收藏
- 关注
原创 Protobuf 和代码生成辅助方法
怎么修改 protobuf 生成的代码?生成好的代码从实践上来说是不应该修改的,而很不幸的 是,protobuf 对应不同插件生成的目标代码,只能改插件的源码;怎么为 protobuf 的字段添加额外的属性?可以通过 field option 来增加额外的属性,但是 这种新的属性需要你自己写代码解析;代码生成的常用场景?一般来说,样板代码都可以考虑使用代码生成来替换掉,比如典型 的利用代码生成来生成数据库查询(如ENT),生成增删改查的代码,生成前端代码;
2023-04-08 18:40:30
1075
原创 SELECT JOIN
* JOIN 语法有两种形态 **JOIN … ONJOIN … USING:USING 后面使用的是列** JOIN 本身有:**也就是说 JOIN 的结构大概可以描述成下面这几种,而且还可以嵌套。表 JOIN 表(表 JOIN 表) JOIN 表表 JOIN 子查询子查询 JOIN 子查询JoinBuilder 里面的 On 和 Using 是终结方法,也就是 直接返回了 Join , 这种设计可以避免用户同时调用 On 或者 Using。
2023-04-03 22:30:58
1111
原创 AOP 方案
优点分查询类型:对增删改查有不同的 Hook;分时机:在查询执行前,或者在查询执行后。这种顺序是预定义好的;修改上下文:每一个 Hook 内部都是可以修改执行上下文的。例如可以利用 这个特性实现一个简单的分库分表中间件;用户用起来还是比较简单的,例如使用 AfterUpdate 的时 候,可以很清楚确定这个会在 Update 语句的时候被调用。缺点也很明显缺乏扩展性,用户指定不了顺序BeforeSave 和 AfterSave 有点令人困惑。
2023-04-03 22:30:45
757
原创 RawQuerier 原生查询
就 MySQL SELECT 语句来说,ORM 框架能支持全部 语法吗?显然不能,也不愿意支持全部 , 也不仅仅是 ORM 框架,大多数框架设计的时候,都要考 虑提供兜底的措施,或者提供绕开你的框架的机制。在 ORM 这里,就是要允许用户手写 SQL,直接绕开 ORM 的各种机制。
2023-04-03 22:30:35
441
原创 事务 API
事务的核心 APIBegin:开始一个事务Commit:提交一个事务Rollback:回滚一个事务需要定义一个新的结构体来表达事务的含义 , 这里本文引入全新的 Tx 来表达事务,和 GORM 的设计是很不一样的。这意味着 DB 在创建好之后,就是一个不可变的对象。这种设计也暗含了一个限制,即一个事务无法开启另 外一个事务,也就是我们的事务都是单独一个个的。如何使用 Tx 呢?原本的 Selector 接收的是 DB 作为参数,现在需要利用 Tx 来创建 Selector,怎么办?
2023-04-03 22:29:33
559
原创 UPDATE Statement
UPDATE 如实现复杂的表达式?首先需要一个 二元表达式,其实现了 Expression 接口,与 WHERE 条件类似,然后利用 column 为起点,构造方法;UPDATE 如何实现 SET 方法?与 Insert 一样,待修改的列沿用 Assignable 抽象,然后利用 relfect 或者 unsafe 将目标值取出。
2023-04-03 22:23:18
780
原创 SELECT 分组、排序与分页
常用的简单 SELECT 语句无疑包括了分组语法 GROUP BY 以及 分组后的条件过滤 HAVING,HAVING 的执行 由于在 WHERE、GROUP BY 和 聚合函数之后,所以 HAVING 也是支持聚合函数的 (;
2023-04-03 22:23:13
1041
原创 INSERT Statement
Dialect 多定义了一个 quoter 方法,是因为希望能够一并解决掉引号的问题。MySQL 引号是 ` ,而 Oracle 是双引 "// quoter 返回一个引号,引用列名,表名的引号 quoter() byte // buildUpsert 构造插入冲突部分 buildUpsert(b * builder , odk * Upsert) error } type standardSQL struct {ORM 框架是如何支持不同的数据库的?
2023-04-03 22:21:26
742
原创 SELECT 列和聚合函数
为什么 WHERE 里面不能使用聚合函数?从 DB 实现的角度来说,是因为聚合函数必须要在数据筛选出来 之后才能计算,也因此,HAVING 是可以使用聚合函数的。简单概括就是,在DB中, 处理顺序是 WHERE - GROUP BY - 聚合函数 - HAVING;WHERE 和 HAVING 的区别:最重要的就是能不能使用聚合函数作为查询条件,以及两者的执行顺序;聚合函数有哪些?常用的就是 Max、Min、Count、Sum、Avg。另外一个类似的问题是,DISTINCT 是不 是聚合函数?
2023-04-03 22:21:21
345
原创 Go Web 框架 Iris
(1) 优点是社区驱动的Go语言Web 框架,支持http2,MVC。有着较高的社区活跃度和文档支持(2) 缺点不够稳定使用数量和国内开源贡献数量目前仍然不如Gin和Echo。
2023-04-03 22:18:02
539
原创 SELECT 结果集处理
ORM 框架怎么处理数据库返回的数据?要点在于,将列映射过去字段(借助于元数据),然后将每一列 的数据解析为字段的类型(这个过程在 Go 里面是由 sql 包完成的),利用反射将转化后的数据塞到结构 体里。unsafe 的过程则类似,不同在于,unsafe 是先在目标地址创建了字段的零值,后面 sql 包把数 据注入到这些地方使用 unsafe 有什么优点?性能更好ORM 的性能瓶颈在哪里,以及怎么解决?两个:构造 SQL 的过程,和处理结果集。前者主要通过 buffer pool 能够极大缓解;
2023-01-31 10:21:09
284
原创 简单 SELECT 的构造
使用Builder 模式,不同的语句的具体实现不同;作为构建 SQL 这一个单独 步骤的顶级抽象使用泛型做约束,这样这样约束目标模型的类型, 以免参数直接定义为接口后,传入未知的类型而报错;Querier 泛型约束接口,发起结果集查询的抽象Executor对于 Update、Insect、Dlete 语句的抽象SELECT 语句规范以MySQL 语法规范为例SELECT:代表这是一个查询语句;FROM:普通表、子查询、JOIN 查询;WHERE。
2023-01-31 10:19:44
384
原创 元数据的构建
orm 框架一般需要定义表的模型,然后模型与表生成映射关系,那么就一定少不了解析模型然后找到与之映射的数据库表,所以,元数据是解析模型获得的,这些元数据将被用于构建 SQL、执行校验,以及用 于处理结果集。模型:一般是指对应到数据库表的 Go 结构体定 义,也被称为 Schema、Table、Meta 等ORM 框架是怎么将一个结构体映射为一张表的(或者反过来)?核心就是依赖于元数据,元数据描述 了两者之间的映射关系。ORM 的元数据有什么用?在构造 SQL 的时候,用来将 Go 类型映射为表;
2023-01-31 10:14:42
1490
原创 ORM 框架
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。ORM 框架的核心是什么?SQL 构造和处理结果集。在别的语言里面,因为底层库可能不够强大, ORM 框架还要解决连接和会话管理的问题,Go 是不需要的。ORM 是什么?ORM 是指对象关系映射,一般是。
2023-01-04 20:23:00
10894
原创 Go web框架 Echo
优点路由性能高更轻量级的web开发框架缺点调试不方便,报错信息不友好路由性能虽高,但是路由实现的算法底层不支持路由排序,会引起路由冲突。
2022-11-11 16:25:35
1443
原创 Go Web框架 Gin
优点支持路由分组运行速度快更好的支持 middleware 和 json灵活性更好(封装程度不如 beego 高), 也可以说是更轻量的框架缺点相比于 beego 更轻量,那么也就没有像 beege 那样提供更多的 api。
2022-11-11 16:19:13
437
原创 Go web框架 Beego
ControllerInterface 可以看做核心接口,因为它直接体现了Beego 的设计初衷:MVC 模式。同时它也是用户核心接入点。但是如果从功能特性上来说,HttpServer 和 ControllerRegister 才是核心。HttpServer 作为服务器抽象,用于管理应用生命周期和资源隔离单位。ControllerRegister 解决了路由注册和路由匹配问题。Context 和 Controller 为用户提供了丰富 API,用于辅助构建系统。简单。
2022-11-11 16:14:31
214
原创 Go AST 编程
AST,即抽象语法树。它是源代码语法结构的一 种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。并发、反射和 AST 三者是构建复杂系统(中间 件)的基石,真正的高级工具。
2022-11-01 16:50:54
1176
原创 python 双重循环处理
在已知集合⼤致数量进⾏双重for循环处理数据时,应该采⽤外⼩内⼤的原则,把⼤循环写在⾥⾯,⼩循环写在外边。在开发过程中经常会遇到对可迭代对象进⾏for循环的操作,甚⾄双重编写for循环进⽽找到匹配条件的数据,某些逻辑上这些操作往往⽆法避免,但可以通过⼀些⽅法使得代码不那么冗余和提升代码效率。对此种循环进⾏优化,不仅使得代码复杂度降低,也提升了执⾏速度。将复杂嵌套数据内容展开,可以使⽤推导式进⾏实现。双重循环获取对象并进⾏⽐较。
2022-10-23 15:40:34
5229
原创 Go channel
利用 channel 实现发布订阅模式非常简单,发布者不断往 channel 里面塞入数据,订阅者从 channel里面取出数据。例子:利用 channel 来实现一个任务池。剩余的细节源码不必纠缠,因为你完全可以根据这个步骤实现同样的功能,但是代码肯定和源码不一样。在有发送者阻塞的情况下,即便缓冲有数据,接收者也是直接拿发送者的数据。在有接收者阻塞的情况下,即便缓冲没满,发送者也是直接交付给接收者。例子:利用 channel 来实现一个基于内存的消息队列,并且。思路:这个例子,难就难在。
2022-10-23 00:11:42
294
原创 Go sync 包
(1) 如果一个新的 goroutine 进来争夺锁,而且队列里面也有等待的 goroutine,你是设计者,你会把锁给谁?(2) 那如果要是每次 G2 想要拿到锁的时候,都被新来的G1 给抢走了,那么 G2 和其它队列的不就是饥饿了吗?后半部分的代码就是控制锁的两种模式,以及进队列,被唤醒的部分了。因此对应的退出饥饿模式,要么队列中只剩下一个goroutine,要么 G2 的等待时间小于 1ms。实际上在这个片段里面,还是很快的,因为没有进入等待队列的环节。里面根本就没有这种东西。**代码演示: **
2022-10-23 00:05:24
758
原创 Go 反射
GORM 也是类似,它将模型元数据称为Schema。文章转载自本人的掘金社区: https://juejin.cn/post/7135610007030562847
2022-10-21 17:36:46
644
原创 Go context 包
Go 1.7 标准库引入 context,中文译作“上下文”,准确说它是 goroutine 的上下文,包含 goroutine 的运行状态、环境、现场等信息。context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。随着 context 包的引入,标准库中很多接口因此加上了 context 参数,例如 database/sql 包。context 几乎成为了并发控制和超时控制的标准做法。
2022-10-20 17:11:56
701
原创 MySQL 实战总结:MySQL 元数据锁(MDL)
前言:当我们在 MySQL 中执行 DDL 语句时,经常会发现语句没有在你预期的时间完成,这时候我们通常会在mysql输入终端输入show full processlist ,来看看发生了什么状况。当你看到 waiting for table metadata lock 时,那就碰到元数据锁了。那元数据锁是怎样产生的又应该怎样避免呢?让我们从这篇文章开始了解它。一、什么是元数据锁(metadata lock)在MySQL5.5.3之前,有一个著名的bug#989(bug链接: MySQL Bug
2022-04-02 19:21:05
8295
4
原创 celery 多队列的划分
celery 队列的划分一.为什么要分队列?往往在生产环境中可能有大量的异步任务需要执行,不同的任务所需要的资源和时间不一样的。为了防止一些非常占用资源或耗时的任务阻塞任务队列导致一些简单任务也无法执行,这时候就需要对任务队列Queue进行合理的划分,将不同任务交由不同的Queue处理。二. 具体代码实现思路下例定义了两个Queue队列,default执行普通任务,insert_data, push执行重型任务。from kombu import Exchange, Queue
2022-03-25 22:19:13
2237
2
原创 MySQLdb、Mysqlclient、PyMySQL 三个python的MySQL库的比较和总结
一.MySQLdb1.介绍MySQLdb又叫MySQL-python ,是 Python 连接 MySQL 的一个驱动,很多框架都也是基于此库进行开发,遗憾的是它只支持 Python2.x,而且安装的时候有很多前置条件,因为它是基于C开发的库,在 Windows 平台安装非常不友好,经常出现失败的情况,现在基本不推荐使用,取代的是它的衍生版本。2.安装由于本机是python3.6的环境,无法直接安装MySQLdb,因此选择放弃。但可以考虑装 Mysqlclient。3.使用资料传送门
2022-02-10 20:22:55
23476
4
原创 设计模式-代理模式(python)
代理模式在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。介绍意图:为其他对象提供一种代理以控制对这个对象的访问。主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一
2022-01-23 19:09:26
128
原创 设计模式责任链模式(python)
责任链模式顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。介绍意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
2021-12-21 00:10:15
144
原创 设计模式--外观模式(pyhton实现)
外观模式外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。介绍 意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 角色:1、外观 1、 子系统类 主要解决:降低访问复杂系统的内部子系统时的
2021-11-06 11:03:23
89
原创 桥模式--pyhton实现
桥模式 内容: 将一个事物的两个维度分离,使其都可以独立的变化。 角色: 抽象 细化抽象 实现者 具体实现者 应用场景:当事物有两个维度上的表现,两个维度都可能扩展时。 优点: 抽象和实现相分离 优秀的扩展能力 总结: 实际上 是把一个事物的抽象部分和实现部分相分离。 本次代码形状是抽象部分,颜色是实现部分。因为代码本身的逻辑是要在 实现部分 构造编写
2021-11-06 10:59:54
119
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人