ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

使用 beedb ORM 操作 SQLite3:基于 build-web-application-with-golang 第 5.5 章实战指南

使用 beedb ORM 操作 SQLite3:基于 build-web-application-with-golang 第 5.5 章实战指南 文档教程【免费下载链接】build-web-application-with-golangA golang ebook intro how to build a web with golang项目地址https://gitcode.com/gh_mirrors/bu/build-web-application-with-golang点击查看免费下载导读本文围绕开源 Go 电子书《build-web-application-with-golang》第 5.5 章配套示例ch.5.5展开完整讲解如何在本仓库环境中搭建 SQLite3 数据库、初始化 beedb ORM并依次走通基于结构体与 map 的增删改查CRUD、Join联表查询与GroupBy/Having分组查询。读完本文你将能够复现ch.5.5示例的全部运行流程并掌握 beedb 链式查询 API 的核心用法与底层映射原理。一、示例概览ch.5.5 要解决什么问题第 5.5 章的目标是演示如何使用 Go 编写的轻量级 ORM 框架beedb对 SQLite3 数据库执行基础 CRUD 操作。仓库中的配套代码位于 fa/code/src/apps/ch.5.5/英文版同目录见 en/code/src/apps/ch.5.5/共包含三个文件文件作用readme.md运行环境搭建与启动步骤说明schema.sql建表脚本创建userinfo与userdetail两张表main.go完整示例程序覆盖插入、查询、更新、删除、联表与分组查询主程序的注释明确说明了用途Example code for Chapter 5.5, Purpose is to show to use BeeDB ORM for basic CRUD operations for sqlite3即本示例是全书 beedb 章节对应英文正文 en/05.5.md的可运行落地版本。二、环境准备安装 SQLite3 并创建数据库按照 readme.md 中的步骤首先需要下载并安装 SQLite3各主流 Linux 发行版均可通过系统包管理器安装macOS 与 Windows 可前往官方站点下载二进制。安装完成后在工作目录下执行以下命令创建名为foo的数据库文件sqlite3 foo.dbsqlite3命令在指定一个不存在的.db文件时会自动创建该数据库文件。注意main.go中定义了常量DB_PATH ./foo.db见 main.go因此数据库文件应创建在与main.go相同的目录下程序运行时才能正确打开。三、加载 schema.sql 建表并验证3.1 建表脚本详解进入 sqlite3 交互式终端后通过.read命令读取建表脚本sqlite .read schema.sqlschema.sql 的内容定义了两张表userinfo用户信息主表uid为INTEGER PRIMARY KEY AUTOINCREMENT自增主键包含username、department部门、created创建时间三个业务字段userdetail用户详情表uid为INT(10)主键包含intro简介与profile档案两个 TEXT 字段。这两张表之间的关联正是后续joinTables函数中userinfo.uiduserdetail.uid联表条件的基础。3.2 验证表是否创建成功加载脚本后用.tables命令列出当前数据库中的所有表sqlite .tables userinfo userdetail输出中出现userinfo与userdetail即表示建表成功。完成验证后退出交互式终端sqlite .exit四、拉取依赖并初始化 beedb4.1 使用 go get 安装依赖readme.md 第 5 步要求运行go get下载并安装远程包。main.go的 import 块main.go声明了三个依赖import ( database/sql github.com/astaxie/beedb _ github.com/mattn/go-sqlite3 time )其中github.com/astaxie/beedb为 ORM 框架本体github.com/mattn/go-sqlite3为 SQLite3 驱动以匿名导入方式注册仅触发其init()完成驱动注册。安装命令为go get github.com/astaxie/beedb go get github.com/mattn/go-sqlite34.2 建立数据库连接与 ORM 对象main.go的入口函数展示了 beedb 的初始化方式main.godb, err : sql.Open(sqlite3, DB_PATH) checkError(err) orm beedb.New(db)流程分为两步先用database/sql标准接口打开 SQLite3 连接再通过beedb.New(db)将连接封装为beedb.Model类型的 ORM 对象。由于 beedb 基于database/sql标准接口实现任何实现了该接口的驱动都可以接入——正文 en/05.5.md 中列出了作者测试过的 MySQL、PostgreSQL、SQLite、Oracle、ODBC 等驱动。对于 MySQL/SQLitebeedb.New的第二个参数数据库引擎标识可以省略若是 SQLServer 需要传mssqlPostgreSQL 则传pg。4.3 结构体与表的映射规则示例定义了与userinfo表对应的结构体main.gotype Userinfo struct { Uid int beedb:PK Username string Department string Created string }这里有两个关键点主键标记beedb 默认以字段id作为主键当主键字段名不同如这里的Uid时必须通过 tag 显式声明写作beedb:PK正文 en/05.5.md 中的写法为PK功能一致。驼峰命名自动转换beedb 会自动将结构体及字段的驼峰命名转换为数据库中的小写下划线命名例如结构体Userinfo对应表userinfo字段Username对应列username。这也是示例中结构体字段名与表列名可以同名异构的原因。此外beedb 支持调试模式在初始化后设置beedb.OnDebug true即可打印底层执行的 SQL 语句方便排查问题见 en/05.5.md。五、核心 CRUD 源码走读5.1 插入结构体方式与 map 方式结构体方式通过orm.Save(obj)完成。insertUsingStructmain.go填充Username、Department与Created时间由getTimeStamp()按2006-01-02 15:04:05格式生成后调用Save插入成功后结构体的Uid会被回填为自增 ID函数将其作为返回值供后续查询使用。map 方式通过链式调用实现。insertUsingMapmain.go构建map[string]interface{}键为列名值为数据add : make(map[string]interface{}) add[username] astaxie add[department] cloud develop add[created] getTimeStamp() id, err : orm.SetTable(userinfo).Insert(add)SetTable(userinfo)指明操作的表Insert返回最后插入的行 ID。这种链式调用风格与 jQuery 类似——每个方法返回 ORM 对象本身便于继续拼接后续操作见 en/05.5.md。正文还补充了批量插入方式构建[]map[string]interface{}切片后调用InsertBatch(addslice)即可一次插入多条记录。5.2 查询单条、多条与 map 结果getOneUserInfomain.go展示了带条件查询单条记录orm.Where(uid?, id).Find(obj)Where支持多种写法详见 en/05.5.md两个参数orm.Where(uid?, 27)?为占位符避免 SQL 注入单参数且为整数orm.Where(3)是Where(主键?, 3)的简写多条件orm.Where(name ? and age ?, john, 88)。getAllUserInfomain.go演示了分页查询多条记录orm.Limit(10).Where(uid?, id).FindAll(alluser)Limit(10)表示最多返回 10 条起始位置默认为 0Limit(10, 20)则从第 20 条开始取 10 条。结果直接映射到[]Userinfo切片。若需要排序可链式追加OrderBy(uid desc,username asc)。getMapsFromSelectmain.go展示了将查询结果放入 map 的方式orm.SetTable(userinfo).SetPK(uid).Where(id).Select(uid,username).FindMap()SetPK(uid)显式指定主键列map 方式下默认主键为id此处必须声明Select(uid,username)指定要返回的列不指定则返回全部列FindMap()返回[]map[string][]byte类型数值型字段需要自行转换。5.3 更新Save 与 map 更新updateUserinfomain.go体现了 beedb 的主键即更新依据设计重新填充Uid及字段后再次调用orm.Save(obj)beedb 检测到结构体已携带主键值便执行 UPDATE 而非 INSERT正文 en/05.5.md 对此有明确说明。updateUsingMapmain.go则演示了 map 批量更新t : make(map[string]interface{}) t[username] updateastaxie lastId, err : orm.SetTable(userinfo).Where(uid?, id).Update(t)被注释掉的orm.SetTable(userinfo).SetPK(uid).Where(2).Update(t)是单条更新写法——Where接收整数 2 时等价于Where(uid?, 2)而示例采用的Where(uid?, id)会将所有满足条件的记录一并更新属于批量更新。5.4 删除Delete、DeleteAll 与 DeleteRow示例提供了三种删除方式main.godeleteWithUserinfo先按主键查出一条记录再调用orm.Delete(obj)删除单条deleteRows使用原生 SQL 风格的链式删除orm.SetTable(userinfo).Where(uid?, 2).DeleteRow()删除满足条件的所有记录deleteAllUserinfo先FindAll查出切片再调用orm.DeleteAll(alluser)批量删除。对应正文 en/05.5.md 的三种删除示例覆盖了按对象删、按切片删、按条件删三种常见场景。六、进阶联表查询与 Group By / Having6.1 Join 联表查询beedb 不直接支持结构体之间的关联映射但通过SetTable链式 API 提供了 SQL 风格的联表能力。joinTablesmain.go实现了一个 LEFT JOINorm.SetTable(userinfo). Join(LEFT, userdetail, userinfo.uiduserdetail.uid). Where(userinfo.uid?, id). Select(userinfo.uid,userinfo.username,userdetail.profile). FindMap()Join方法接收三个参数en/05.5.md参数位置含义示例取值第一个连接类型INNER、LEFT、OUTER、CROSS等第二个关联的表名userdetail第三个连接条件userinfo.uiduserdetail.uid联表结果通过FindMap以 map 形式返回可同时取两张表的列如userdetail.profile。6.2 Group By 与 Havinggroupbymain.go演示了分组统计查询orm.SetTable(userinfo).GroupBy(username).Having(usernameupdateastaxie).FindMap()GroupBy(username)指定分组字段Having(...)指定分组后的过滤条件语义与 SQL 标准一致。对应正文 en/05.5.md 的说明二者组合可完成先分组、再按组过滤的聚合查询需求。七、运行验证与预期输出完成上述步骤后在ch.5.5目录下执行第 6 步go run main.go程序将按照main函数的编排顺序main.go依次执行插入结构体 map→ 单条/多条查询 → 更新结构体 map→ map 查询 / 分组 / 联表 → 三种方式删除。每个函数开头都会打印函数名例如Inserting insertUsingStruct() {0 Test Add User Test Add Department 2026-10-03 00:43:26} insertUsingMap() Last row inserted id 2 ...insertUsingStruct()打印的结构体中Uid:0为插入前的初始值插入后通过返回值拿到自增主键。若在初始化后启用了beedb.OnDebug true终端还会输出每条操作对应的真实 SQL 语句便于将链式 API 与底层 SQL 一一对应。八、注意事项与扩展阅读驱动适配beedb 支持database/sql标准接口除 SQLite3 外正文 en/05.5.md 还测试了 MySQL、PostgreSQL、Oracle、ODBC 等驱动切换数据库时只需更换匿名导入的驱动包并在beedb.New中按需传入引擎标识。命名转换beedb 将驼峰命名自动转为小写下划线因此自定义结构体时字段名需与表列名保持这种对应关系否则需自行处理映射。主键声明凡是主键字段不是id的表如本示例的uid在结构体 tag 与 map 查询中都必须通过PKtag /SetPK显式声明。关联查询边界beedb 不支持结构体间的一对一、一对多、多对多自动关联正文 en/05.5.md 指出其设计定位是轻量 ORM需要联表时使用Join链式调用正文末尾的 Future 一节记录了作者计划支持关联映射、自动建表、goroutine 连接池等后续方向。章节关联本示例是全书第 5 章数据库操作中 SQLite 小节5.25.4 分别讲解了database/sql与 SQLite/MySQL/PostgreSQL 驱动用法之后的 ORM 实践环节后续章节05.6将继续介绍 NoSQL 数据库。赞分享文档教程【免费下载链接】build-web-application-with-golangA golang ebook intro how to build a web with golang项目地址https://gitcode.com/gh_mirrors/bu/build-web-application-with-golang点击查看免费下载相关推荐build-web-application-with-golang 第 5.5 章实战基于 beedb 的 SQLite3 环境搭建与 CRUD 示例运行指南build web application with golang 第 5.5 章实战基于 beedb 的 SQLite3 环境搭建与 CRUD 示例运行指南文档教程基于 beedb 开发 Go 轻量级 ORMstruct 映射与 CRUD 全流程实战build-web-application-with-golang 第 5.5 节基于 beedb 开发 Go 轻量级 ORMstruct 映射与 CRUD 全流程实战build web application with golang 第文档教程build-web-application-with-golang ORM教程基于beedb开发数据访问层build web application with golang ORM教程基于beedb开发数据访问层 你是否还在为Golang Web开发中的数据访问层文档教程上一篇Linux下OBS Studio回放缓冲区保存失败的终极解决方案下一篇猫抓浏览器扩展终极指南5分钟学会全网视频音频资源下载创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表