前言 最近在公司有开始接触 Go 的项目,想系统的学习一下。相对来说 Go 的语法还是比较简单,很容易上手。快速看完两本入门书,想找一些偏项目的书来看,发现目前国内还是比较少。然后翻了一下培训机构的教程,感觉也不是很好,偶然在油管上看到这个教程 Backend master class ,感觉讲的不错,就把这个教程整理出来。
介绍 这是一个从设计、开发到部署的完整的 Go 项目,使用 PostgreSQL、Golang 和 Docker,这个项目主要来构建一个简单的银行系统,主要提供一下功能:
创建和管理帐户:所有者、余额、货币
记录所有余额变化:为每次更改创建一个帐户条目
转账交易:在一笔交易中,在两个账户之间进行一致的转账
数据库设计 设计数据库架构 使用 dbdiagram.io 设计表结构,采用的 DSL 语言来定义:
Table accounts as A { id bigint [pk, increment, note: '主键'] owner varchar [not null, note: '账户所有者'] balance bigint [not null, note: '账户余额'] currency varchar [not null, note: '货币类型,比如:人民币'] created_at timestamptz [not null, default:`now()`, note: '创建时间'] Indexes { owner } note: '账户' } Table entries { id bigint [pk, increment, note: '主键'] account_id bigint [not null, ref: > A.id, note:'账户id,关联account的id'] amount bigint [not null, note:'变化金额,可正可负'] created_at timestamptz [not null, default:`now()`, note: '创建时间'] Indexes { account_id } note: '记录所有余额变化' } Table transfers { id bigint [pk, increment, note: '主键'] from_account_id bigint [not null, ref: > A.id, note: '转账id'] to_account_id bigint [not null, ref: > A.id, note: '被转账id'] amount bigint [not null, note: '必须为正'] created_at timestamptz [not null, default:`now()`, note: '创建时间'] Indexes { from_account_id to_account_id (from_account_id, to_account_id) } note: '转账交易记录' }
可以生成响应的关系图:
可以导出 PostgreSQL,MySQL等等
还可以创建分享链接,这个表的链接为: https://dbdiagram.io/d/5fcc5ee49a6c525a03b9f27d
使用 Docker 安装 Postgers 先安装 docker,可参考网上
先登入 docker 官方,查找可用的镜像,找到一个为 12-alpine
,使用 docker pull <image>:<tag>
方式拉去这个镜像
docker pull postgres:12-alpine
输入 docker images
就可看到我们拉去的镜像了
~ docker images REPOSITORY TAG IMAGE ID CREATED SIZE postgres 12-alpine b5a8143fc58d 3 weeks ago 158MB
通过以下格式来运行,我们知道一个镜像(image)可用运行多个容器(container)
docker run --name<container_name> // 容器名称 -e <environment_variable> // 环境变量 -p <host_port:containter_ports> // 端口映射 -d <image>:<tag> // 后台运行
运行镜像:
docker run --name postgres12 \ -e POSTGRES_USER=root -e POSTGRES_PASSWORD=12356 \ -p 5432:5432 \ -d postgres:12-alpine \
使用 docker ps
查看运行的镜像
~ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5c337d6516a6 postgres:12-alpine "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:5432->5432/tcp postgres12
在运行的容器中执行命令:
docker exec -it <container_name_or_id> <commend> [args]
进入 postgres 命令终端
docker exec -it postgres12 psql -U root psql (12.5) Type "help" for help. root=#
使用 DataGrip 连接数据库,并且把生成的 SQL 导入 DataGrip 中,生成相应的表。
SQL/GORM/SQLX/SQLC生成CRUD的比较 SQL
GORM
CRUD 已经实现了
需要学习一些 gorm 语法
比较慢
SQLX
SQLC
最终我们选择 SQLC,https://github.com/kyleconroy/sqlc
在 mac 上安装
brew install kyleconroy/sqlc/sqlc