Go语言开发基于SQLite数据库实现用户表增删改查项目搭建(一)

背景

前几天我们不是写了个关于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数据库实现用户表相关接口项目示例,可进行扩展,拿来即用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/914692.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读-Event-based Visible and Infrared Fusion via Multi-task Collaboration

一、前言 可见光图像与红外图像融合(VIF)通过结合热红外图像与可见光图像的丰富纹理,提供了一个全面可靠的场景描述。然而,传统的VIF系统可能在极端光照和高动态运动场景中捕获过曝或欠曝的图像,进而导致融合结果下降…

TDesign了解及使用

文章目录 1、概述2、快速开始2.1使用 npm 安装2.2通过 浏览器引入 安装2.3、使用 3、简单案例3.1 路由创建3.2、 页面创建3.3、 Table组件3.4、序号展示3.5、 图片展示及预览3.6、 性别字段处理 1、概述 TDesign 是腾讯推出的设计系统,旨在提供一致的设计语言和视觉…

C++初阶——list

一、什么是list list是一个可以在序列的任意位置进行插入和删除的容器,并且可以进行双向迭代。list的底层是一个双向链表,双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过将每个元素与前一个元素的链接和后一个元素的链接关联起来&…

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动,日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

NAT网络工作原理和NAT类型

NAT基本工作流程 通常情况下,某个局域网中,只有路由器的ip是公网的,局域网中的设备都是内网ip,内网ip不具备直接与外部应用通信的能力。 处于内网的设备如何借助NAT来实现访问外网的应用? 对于开启了NAT功能的局域网…

两个方法,取消excel数据隐藏

Excel文件中制作了数据表格,因为有些数据不方便显示但是又不能删掉,大家可能会选择隐藏数据,那么,excel隐藏的部分如何显示出来?今天分享两个方法给大家。 方法一: 选中隐藏的区域,点击右键&a…

【JavaEE进阶】Spring 事务和事务传播机制

目录 1.事务回顾 1.1 什么是事务 1.2 为什么需要事务 1.3 事务的操作 2. Spring 中事务的实现 2.1 Spring 编程式事务(了解) 2.2 Spring声明式事务 Transactional 对比事务提交和回滚的日志 3. Transactional详解 3.1 rollbackFor 3.2 Transactional 注解什么时候会…

npm list @types/node 命令用于列出当前项目中 @types/node 包及其依赖关系

文章目录 作用示例常用选项示例命令注意事项 1、实战举例**解决方法**1. **锁定唯一的 types/node 版本**2. **清理依赖并重新安装**3. **设置 tsconfig.json 的 types**4. **验证 Promise 类型支持** **总结** npm list types/node 命令用于列出当前项目中 types/node 包及其…

【靶点Talk】BCMA疗法能否成为下一个掘金点?

BCMA是一种极其重要的B细胞生物标志物,广泛存在于MM细胞表面,近年来已成为MM和其他血液系统恶性肿瘤的一个非常热门的免疫治疗靶点。今天靶点科普给大家带来BCMA作用机制和临床研究进展: 1 BCMA的“简历” B细胞成熟抗原(BCMA,又…

Linux 网络编程

网络编程:OSI 七层模型、TCP 协议、UDP 协议、三次握手、四次挥手、socket编程及编程实战 // 掌握网络编程,TCP、UDP等,socket函数编程 前置知识: 网络通信 网络通信本质上是一种进程间通信,是位于网络中不同主机上的进…

中文核心期刊论文模板免费下载

大家好,今天我要和大家分享一个对学术研究人员非常有帮助的资源——中文核心期刊论文模板。这个模板严格遵循中文核心期刊的出版标准,旨在帮助作者按照期刊的基本格式和内容要求撰写论文,确保论文结构清晰、规范,从而提高投稿效率…

Linux之DNS服务器

一、DNS 简介 定义与作用:DNS(Domain Name System)是互联网上的一项服务,作为将域名和 IP 地址相互映射的分布式数据库,使人更方便地访问互联网。使用 53 端口,通常以 UDP 查询,未查到完整信息…

已解决:spark代码中sqlContext.createDataframe空指针异常

这段代码是使用local模式运行spark代码。但是在获取了spark.sqlContext之后,用sqlContext将rdd算子转换为Dataframe的时候报错空指针异常 Exception in thread "main" org.apache.spark.sql.AnalysisException: java.lang.RuntimeException: java.lang.Nu…

物联网低功耗广域网LoRa开发(一):LoRa物联网行业解决方案

一、LoRa的优势以及与其他无线通信技术对比 (一)LoRa的优势 1、164dB链路预算 、距离>15km 2、快速、灵活的基础设施易组网且投资成本较少 3、LoRa节点模块仅用于通讯电池寿命长达10年 4、免牌照的频段 网关/路由器建设和运营 、节点/终端成本低…

【2024最新】渗透测试工具大全(超详细),收藏这一篇就够了!

【2024最新】渗透测试工具大全(超详细),收藏这一篇就够了! 黑客/网安大礼包:👉基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 所有工具仅能在取得足够合…

Redis - 哨兵(Sentinel)

Redis 的主从复制模式下,⼀旦主节点由于故障不能提供服务,需要⼈⼯进⾏主从切换,同时⼤量 的客⼾端需要被通知切换到新的主节点上,对于上了⼀定规模的应⽤来说,这种⽅案是⽆法接受的, 于是Redis从2.8开始提…

双十二入手什么比较划算?双十二母婴好物推荐

随着双十二购物狂欢节的临近,双十二入手什么比较划算?许多准父母和有小孩的家庭都在寻找最佳的母婴产品优惠。在这个特别的日子里,各大电商平台都会推出一系列针对母婴用品的折扣和促销活动,使得这个时期成为囤货和更新宝宝生活必…

[运维][Nginx]Nginx学习(1/5)--Nginx基础

Nginx简介 背景介绍 Nginx一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时也是一个【POP3/SMTP/IMAP代理服务器】,是由伊戈尔赛索耶夫(俄罗斯人)使用C语言编写的,Nginx的第一个版本是2004年10月4号发布的0.1.0版本。另外值得一…

手动安装Ubuntu系统中的network-manager包(其它包同理)

自己手闲把系统中的network-manager包给删了,导致的结果就是Ubuntu系统彻底没有网络。结果再装network-manager时,没有网络根本装不了,网上的方法都试了也没用,然后就自己源码装,这篇文章就是记录一下怎么手动下载包然…

【 ElementUI 组件Steps 步骤条使用新手详细教程】

本文介绍如何使用 ElementUI 组件库中的步骤条组件完成分步表单设计。 效果图: 基础用法​ 简单的步骤条。 设置 active 属性,接受一个 Number,表明步骤的 index,从 0 开始。 需要定宽的步骤条时,设置 space 属性即…