dbdot dbdot is a command line tool that generates DOT description from postgres database schema. dbdot...Demos Demo 1: Produce DOT for all the tables in postgres db pgguide and user kewluser $ ....5432) -schema string schema name (default "public") -sslmode enable sslmode for postgres...db connection -user string username of postgres db -whitelist string comma separated
mysql_fdw 的作用: 用来在PG中快速访问MySQL中的数据。...1、MySQL中账号授权 在 192.168.2.4 这个 MySQL服务器上创建相关账号和授权 (测试的时候权限放的比较大,实际生产上要严格控制权限) create user dts@'%' identified...make USE_PGXS=1 make USE_PGXS=1 install chown postgres.postgres /usr/local/pgsql-11.5/lib/mysql_fdw.so... # 我这里用root账号编译的,需要改下最终的pg文件夹下的 .so 文件的权限 然后,修改pg的配置文件, 加入 mysql_fdw这个功能 shared_preload_libraries =... user mapping for postgres server mysql_server_db10 ; postgres=# drop server mysql_server_db10 ; DROP
main import ( "database/sql" _ "github.com/go-sql-driver/mysql" "log" ) func main() { //连接数据库查询...= nil { log.Fatal(err.Error()) } //获取列名 columns, _ := rows.Columns() //定义一个切片,长度是字段的个数,切片里面的元素类型是...interface{} 接口 scanArgs := make([]interface{}, len(values)) for i := range values { //把sql.RawBytes类型的地址存进去了
操作系统中的文件 数据库的本质其实就是用来存储数据的,所以免不了和文件系统、存储进行交互,万丈高楼平地起,存储一般是一个数据库的最底层,Postgres 在存储的文件管理方面也有很多的设计与抽象。...Postgres 的 VFD 作用 Postgres 数据库在运行的过程当中,可能会打开非常多的文件,比如数据表对应的文件,元数据表文件,以及一些在 SQL 运行时打开的临时文件,例如排序、哈希表所需的文件...所以有非常大的概率超过单个进程打开文件数量的限制,为了解决这个问题,Postgres 设计了 VFD(虚拟文件描述符)机制,主要是将实际的操作系统文件描述符维护到一个 LRU 缓存中,通过切换打开的方式...VFD 的基本工作方式 Postgres 主要通过一个进程私有的数组来维护 VFD,名为 VfdCache。...在打开文件的时候,会尝试关闭最久未使用的文件,将位置留给最新打开的文件。 通过这种方式,Postgres 可以打开远超过系统和进程限制的文件数量,是一个非常精妙的设计。
最近工作遇到一个小问题,即如何使用原生的sql查询where in语句,因为之前使用gorm习惯了,gorm已经封装好了,突然写原生的反而有点不熟悉,同时还要考虑到性能和代码是否繁琐,所以写这个笔记记录一下当时的几种解决方法...场景 我传入in的范围是一个数组,里面值的类型为int64型,例如如下: idSlice := []int{1, 2, 3, 4, 5, 6, 7} 正常的sql语句是这样写的: select * from...,这在gorm可以是因为已经封装好了,所以经过多次试错和思考之后,反应过来,其实in的范围要写成字符串的形式,毕竟是把整条sql当成原生的查询语句,所以不能出现变量之类的东西, idSlice为数组类型...这样对整体的性能就有影响了。...strings.Joins函数,只用了一个for循环直接拼接,所以整体的性能是更优的。
defer func() { print("打印中") }() defer print("打印后") panic("触发异常") defer print(666) //IDE...函数的return value 不是原子操作, 在编译器中实际会被分解为两部分:返回值赋值 和 return 。而defer刚好被插入到末尾的return前执行(即defer介于二者之间)。...,因此defer能够改变返回值) defer不影响返回值,除非是map、slice和chan这三种引用类型,或者返回值定义了变量名 ---- 参考: Golang研学:如何掌握并用好defer[2]--...存疑("引用传递"那里明显错误) Golang中的Defer必掌握的7知识点 参考资料 [1] Go面试题答案与解析: https://yushuangqi.com/blog/2017/golang-mian-shi-ti-da-an-yujie-xi.html...[2] Golang研学:如何掌握并用好defer: https://segmentfault.com/a/1190000019063371#comment-area
defer在go语言中可以发挥很大的作用,在函数中定义的defer会放在return前执行,defer后面可以放一些资源关闭的操作,以防忘记关闭资源而浪费空间。...package main import "fmt" // 传指针到匿名函数中 func f() (x int){ defer func(x *int){ (*x)++ }(&x) return...1 } func main(){ res := f() fmt.Println(res) } 这里打印出的res为2,defer的执行步骤是在返回值赋值和再真正返回RET之间,所以这里它真正改变的是...int类型的指针,所以真正的x在返回RET之前,返回值x赋值之后又进行了一次改变,所以返回的值进行了加一的操作,变为了2
数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int、string 等,也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。...在 Golang 中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说 [5]int 和 [10]int 是两个不同的类型。...Golang中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。...{1, 1}, } modifyArray2(b) //在 modify 中修改的是 b 的副本 x fmt.Println(b) //[[1 1] [1 1] [1 1]]...=” 操作符,因为内存总是被初始化过的。 [n]T 表示指针数组,[n]T 表示数组指针。 6、多维数组 Go 语言是支持多维数组的,我们这里以二维数组为例(数组中又嵌套数组)。
golang实现反射是通过reflect包来实现的, 让原本是静态类型的go具备了很多动态类型语言的特征。reflect包有两个数据类型,一个是Type,一个是Value。...接着我们开始我们使用Golang反射,通常在使用到Golang反射的时候会有三种定律: 反射定律一:反射可以将“接口类型变量”转换为“反射类型对象”....如果反射对象中包含的值是原始值,那么可以通过反射对象修改原始值,如果反射对象中包含的值不是原始值(反射对象包含的是副本值或指向原始值的地址),那么该反射对象是不可以修改的。...反射的性能测试 Golang提供了一个testing包,使得单元测试、性能测试尤为简单。...我们可以使用golang testing来做一下reflect的最简单的性能测试。 Type:Type类型用来表示一个go类型。 不是所有go类型的Type值都能使用所有方法。
在传递时间参数的时候,很多函数的参数类型是time.Duration 官方解释: Duration 将两个瞬间之间的经过时间表示为 int64 纳秒计数。...默认是纳秒单位 如果想传递一个10秒的时间进去,需要这样转换,其实就是把我们传递的整型进行了乘法 second := 10 time.Duration(seconds)*time.Second time.Second...Minute = 60 * Second Hour = 60 * Minute ) time.Duration(seconds) 是进行的类型转换...,把我们的整型转换成了time.Duration类型 然后把我们传递的10 * 1000 * 1000 ,这样就是我们想要的结果了
--- 在结构导出时,序列(Sequence)的当前值无法通过pg_dump导出,只能通过事后查询该序列的当前值并写入目标库。...查询序列的当前值,有两种办法: select currval('seqname') 仅获得当前会话最后一次生成的值。...实际执行中,必须先执行nextval后才能执行currval,这样会修改源数据库,不可取 select last_value from seqname 获得所有会话中最后一次生成的值 修改目标库序列的当前值...select setval('seqname', val) 修改序列当前值(原子操作) alter sequence seqname restart with val 修改序列当前值(阻塞性事务,会阻塞其他会话的nextval...操作) 建议采用的方案 既可以干净地获取源值,又能低成本地设置到目标。
在比较时间的时候,比较有用的一个方法,判断两个时间的前后关系 a.before(b) 如果a在b之前,就返回true ,否则返回false func TestTimeBefore(t *testing.T
到 2020 年年中,很明显,产品的使用将超过我们值得信赖的 Postgres 单体的能力,后者在五年和四个数量级的增长中尽职尽责地为我们服务。...查询性能和维护过程通常在表达到最大硬件绑定大小之前就开始下降;我们停止的 Postgres auto-vacuum 就是这种软限制的一个例子。...应用级分片 我们决定实现我们自己的分区方案并从应用程序逻辑路由查询,这种方法称为应用程序级分片。...在我们最初的研究中,我们还考虑了打包的分片/集群解决方案,例如用于 Postgres 的 Citus 或用于 MySQL 的 Vitess。...“暗”读:在迁移读查询之前,我们添加了一个标志来从新旧数据库中获取数据(称为暗读)。我们比较了这些记录并丢弃了分片副本,记录了过程中的差异。引入暗读增加了 API 延迟,但提供了无缝切换的信心。
从任何节点查询分布式 Postgres 表 升级到 Citus 11 等等,我的分片在哪里?...Citus 11.0 中最大的增强是,您现在可以始终从集群中的任何节点运行分布式查询,因为 schema 和 metadata 是自动同步的。...从任何节点查询分布式 Postgres 表 Citus 11 还带有一个重要的新功能:自动 schema 和 metadata 同步。...无需更改应用程序: 您的应用程序可以继续将您的 Postgres 查询路由到 Citus 协调器,就像您一直做的那样,并让 Citus 确定如何分发查询。...现在最苛刻的数据密集型应用程序可以选择从任何节点进行查询: 如果您愿意并且需要,您可以在 Citus 工作节点之间对 Postgres 查询进行负载均衡。
在src目录下放着我的源码比如: ?...在同一个目录下,比如websocket,不需要import,就可以互相调用其它文件的函数,但是在go run的时候要把那几个用到的文件都加上 如果在websocket目录下定义了其他包,就要新建目录,里面的...server包下的websocket.go ? 使用go run main.go my.go ,可以全部打印出来 ?
函数 函数调用:函数调用时需要传递函数定义中要求的参数,并根据需要接收返回值。 匿名函数:匿名函数没有函数名,可以直接定义并调用。常用于函数内部作为闭包使用。...表示可变参数,可变参数必须放在函数参数列表的最后面,并且只能有一个。 函数作为参数:可以将函数作为参数传递给其他函数,这种函数称为高阶函数。常用于函数式编程中。...函数的变量作用域 函数中声明的变量作用域是该函数内部,在函数外部是不可见的。如果函数中使用了全局变量,则在函数中可以直接使用。 函数的递归调用 函数可以递归调用,递归调用必须有一个终止条件。...当函数返回时,栈中的 defer 语句被逆序执行,最后输出 "deferred"。 除了可以用来清理资源,defer 语句还可以用来记录函数的执行时间。...} 在这个例子中,timeTrack 函数用来记录函数的执行时间。
struct interface 就可以实现面向对象中的继承,封装,多态 继承的演示: Tsh类型继承People类型,并且使用People类型的方法 多态的演示 Tsh类型实现了接口Student,实现了接口定义的方法...struct { People } func (t Tsh) Do() { fmt.Println("taoshihan do") } func main() { //继承的演示...t := Tsh{People{}} t.echo() //多态的演示 var student Student student = t student.Do
一、查询语句形式 1.叶子语句 2.复合语句(一条复合语句可以是多条叶子语句和多个复合语句组成) 二、查询和过滤的区别 1.过滤是将查询设置为是否匹配(只有是和否两种情况),查询会缓存 2.查询是判断文档是否匹配同时判断文档的匹配程度...(_score字段),查询不缓存 三、查询 1.match_all查询简单的匹配所有文档 { “match_all”: {}} 2.match匹配指定字段(可能是精确查询也可能是全文查询)...” ], “query”: “build too” } 4.range查询找出落在指定区间内的数字或者时间 { “range”: { “age”: {...}} 7.exists查询文档中包含指定字段有值 { “exists”: { “field”: “create_time” } } 备注:Missing... “filter”: { “match”: {“age”:26} } } } } b)使用constant_score可以取代只有filter的bool
定义和说明 type hchan struct { qcount uint // total data in the queue // 这里是buffer channel中的...buf unsafe.Pointer // 在channel中存储单个元素的大小 elemsize uint16 // channel的状态,当创建channel时候closed=...type waitq struct { // sudog是golang routine的数据结构 first *sudog last *sudog } chan和goroutine关系 定义简单调试代码...,在recvq的队列会存储goroutine的结构,这也说明golang中是以通信方式来达到内存共享的方式 *runtime.hchan { qcount: 0, dataqsiz...当带有缓冲的chan中数据写满了,chan数据会被保存在当前goroutine中 chan中的数据发送或者接受都是值传递 读写nil的channel不会导致但是会导致阻塞 func chansend(
RPC 简介 远程过程调用(Remote Procedure Call,缩写为 RPC) 可以将一些比较通用的场景抽象成微服务,然后供其他系统远程调用 RPC 可以基于HTTP协议 也可以基于TCP...协议,基于HTTP协议的RPC像是我们访问网页一样(GET/POST/PUT/DELETE/UPDATE),大部分的RPC都是基于TPC协议的(因为基于传输层,效率稍高一些) 基于TCP 的 RPC 工作过程...客户端对请求的对象序列化 客户端连接服务端,并将序列化的对象通过socket 传输给服务端,并等待接收服务端的响应 服务端收到请求对象后将其反序列化还原客户端的对象 服务端从请求对象中获取到请求的参数...,然后执行对应的方法,得到返回结果 服务端将其结果序列化并传给客户端,客户端得到响应结果对象后将其反序列化,得到响应结果 Golang中的RPC 注:例子参考 golang实现RPC...的几种方式 net/rpc库 注:没办法在其他语言中调用上面例子实现的RPC方法 服务端 rpc_server.go package main import ( "errors"
领取专属 10元无门槛券
手把手带您无忧上云