背景
前几天我们不是写了个关于go语言解决rtsp协议只播放部分的问题(业务问题)这个么
里面用到了mysql,但不够轻量级,如果有的项目地需要的话,我们还需要部署mysql
其实这个项目就使用了一个表,没必要搞mysql,那有没有轻量级一些的,免安装的。
当然有,那就是SQLite
这一期我们就来实现基于SQLite数据库实现用户表增删改查
接口的话我们采用restful风格
代码风格的话因为我java使用的比较多,习惯用mvc三层架构,
所以我这面也手动的创建了三层模型架构。
SQLite简单介绍
sql官网地址
什么是 SQLite?
SQLite 是一个 C 语言库,它实现了一个 小型、 快速、 独立、 高可靠性、 功能齐全的SQL 数据库引擎。SQLite 是世界上使用最广泛的数据库引擎。SQLite 内置于所有手机和大多数计算机中,并且捆绑在人们每天使用的无数其他应用程序。
特点:
搭建
引入依赖
sqlite引入
go get github.com/mattn/go-sqlite3
gin引入
go get github.com/gin-gonic/gin
创建文件夹
初始化数据库
var (
Db *sql.DB
)
func InitDb(dbName string) {
var err error
Db, err = sql.Open("sqlite3", "./"+dbName+".db")
if err != nil {
log.Fatal(err)
}
}
func DbClose() {
if Db != nil {
Db.Close()
}
}
初始化路由
func InitRouter() *gin.Engine {
var router = gin.New()
//gin.SetMode(gin.ReleaseMode)
// 没有路由即 404返回
router.NoRoute(func(g *gin.Context) {
g.JSON(http.StatusNotFound, gin.H{
"code": 404,
"msg": fmt.Sprintf("not found '%s:%s'", g.Request.Method, g.Request.URL.Path)})
})
router.Use(Cors())
// 设置路由组
api := router.Group("/api")
{
InitUserRouter(api)
}
return router
}
用户路由组
func InitUserRouter(router *gin.RouterGroup) {
m := &controller.UserController{
UserService: application.GetUserService(),
}
userRouter := router.Group("/user")
user := new(model.User)
//创建对应的表
user.CreateTable(config.Db, user.CreateTableSql())
userRouter.POST("/", func(c *gin.Context) {
req.NewCtxWithGin(c).Handle(m.Insert)
})
userRouter.POST("/page", func(c *gin.Context) {
req.NewCtxWithGin(c).Handle(m.GetPageList)
})
userRouter.GET("/:id", func(c *gin.Context) {
req.NewCtxWithGin(c).Handle(m.GetById)
})
userRouter.DELETE("/:id", func(c *gin.Context) {
req.NewCtxWithGin(c).Handle(m.DeleteById)
})
userRouter.PUT("/:id", func(c *gin.Context) {
req.NewCtxWithGin(c).Handle(m.UpdateById)
})
}
用户结构体
type User struct {
ModelTable
Username string `json:"username" db:"username"`
PassWord string `json:"password" db:"password"`
}
func (u *User) TableName() string {
return "user"
}
// TableName 用于获取表名(由具体的子类重写)
func (u *User) CreateTableSql() string {
return fmt.Sprintf(""+
"CREATE TABLE IF NOT EXISTS %s "+
"(id INTEGER PRIMARY KEY AUTOINCREMENT, "+
"username TEXT NOT NULL, "+
"password TEXT NOT NULL"+
");",
u.TableName())
}
ModelTable 基类
type ModelTable struct {
Id uint64 `json:"id" db:"id"`
}
// TableName 用于获取表名(由具体的子类重写)
func (m *ModelTable) TableName() string {
return ""
}
// 具体的表信息 子类自己去实现
func (m *ModelTable) CreateTableSql() string {
return ""
}
func (m *ModelTable) CreateTable(db *sql.DB, sql string) error {
// 执行创建表的 SQL
_, err := db.Exec(sql)
if err != nil {
return fmt.Errorf("failed to create table: %v", err)
}
return nil
}
func GetById(tableName string, id uint64, dest interface{}) (interface{}, error) {}
func getFieldPointers(t reflect.Type, v reflect.Value) ([]interface{}, error) {}
func UpdateById(tableName string, dest interface{}, id uint64) error {}
func DeleteById(tableName string, id uint64) error {}
func Insert(model interface{}) error {}
func GetPageList(tableName string, page int, pageSize int, result interface{}) (*PageResult, error) {}
main.go 监听端口
func main() {
config.InitDb("user")
r := router.InitRouter()
r.Run(":6666")
}
这样就简单的搭建完成了,具体的三层模型中的内容,在后面的章节在进行创建
源码地址
使用Go语言开发基于SQLite数据库实现用户表相关接口项目示例,可进行扩展,拿来即用