新闻中心

Golang如何操作SQLite数据库_Golang SQLite数据库CRUD示例

2025-12-02
浏览次数:
返回列表
Go语言通过database/sql和mattn/go-sqlite3驱动操作SQLite,实现增删改查:先用sql.Open连接数据库并Ping验证,接着Exec创建表,使用预处理语句插入数据并获取ID,QueryRow查询单行、Query多行遍历结果,Exec配合RowsAffected更新或删除记录,最后完整示例展示流程,适用于轻量级项目开发。

golang如何操作sqlite数据库_golang sqlite数据库crud示例

Go语言操作SQLite数据库非常简单,主要通过database/sql包结合第三方驱动(如modernc.org/sqlitemattn/go-sqlite3)来实现。本文使用广泛使用的mattn/go-sqlite3驱动,演示如何在Golang中完成SQLite的增删改查(CRUD)操作。

安装依赖

使用以下命令安装SQLite驱动:

go get github.com/mattn/go-sqlite3

连接SQLite数据库

打开或创建SQLite数据库文件只需调用sql.Open并指定驱动名和数据库路径:

db, err := sql.Open("sqlite3", "./example.db")
if err != nil {
  log.Fatal(err)
}
defer db.Close()

如果文件不存在,SQLite会自动创建它。注意:即使数据库文件未创建,sql.Open也不会立即报错,建议执行一条简单查询验证连接:

if err = db.Ping(); err != nil {
  log.Fatal(err)
}

创建数据表

使用db.Exec执行DDL语句创建表:

createTableSQL := `CREATE TABLE IF NOT EXISTS users (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  name TEXT NOT NULL,
  email TEXT UNIQUE NOT NULL
);`
_, err = db.Exec(createTableSQL)
if err != nil {
  log.Fatal(err)
}

插入数据(Create)

使用预处理语句防止SQL注入,Exec返回结果对象可获取自增ID:

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版 动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联J*aScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR*函数库的强大功能,对常用的、强大的包

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版 525 查看详情 动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版 insertSQL := "INSERT INTO users(name, email) VALUES(?, ?)"
result, err := db.Exec(insertSQL, "Alice", "alice@example.com")
if err != nil {
  log.Fatal(err)
}
id, err := result.LastInsertId()
if err != nil {
  log.Fatal(err)
}
fmt.Printf("插入成功,ID: %d\n", id)

查询数据(Read)

使用QueryQueryRow读取数据:

// 查询单行
var name, email string
err = db.QueryRow("SELECT name, email FROM users WHERE id = ?", 1).Scan(&name, &email)
if err != nil {
  if err == sql.ErrNoRows {
    fmt.Println("用户不存在")
  } else {
    log.Fatal(err)
  }
}
fmt.Printf("用户: %s, 邮箱: %s\n", name, email)

// 查询多行
rows, err := db.Query("SELECT id, name, email FROM users")
if err != nil {
  log.Fatal(err)
}
defer rows.Close()

for rows.Next() {
  var id int
  var name, email string
  err := rows.Scan(&id, &name, &email)
  if err != nil {
    log.Fatal(err)
  }
  fmt.Printf("ID: %d, 名字: %s, 邮箱: %s\n", id, name, email)
}

更新数据(Update)

使用Exec执行UPDATE语句,检查影响行数判断是否成功:

updateSQL := "UPDATE users SET email = ? WHERE name = ?"
result, err := db.Exec(updateSQL, "new_email@example.com", "Alice")
if err != nil {
  log.Fatal(err)
}
count, err := result.RowsAffected()
if err != nil {
  log.Fatal(err)
}
fmt.Printf("更新了 %d 条记录\n", count)

删除数据(Delete)

DELETE操作与UPDATE类似:

deleteSQL := "DELETE FROM users WHERE id = ?"
result, err := db.Exec(deleteSQL, 1)
if err != nil {
  log.Fatal(err)
}
count, err := result.RowsAffected()
if err != nil {
  log.Fatal(err)
}
fmt.Printf("删除了 %d 条记录\n", count)

完整示例代码结构

将上述逻辑整合成一个可运行程序:

package main

import (
  "database/sql"
  "fmt"
  "log"
  "_ github.com/mattn/go-sqlite3"
)

func main() {
  db, err := sql.Open("sqlite3", "./example.db")
  if err != nil {
    log.Fatal(err)
  }
  defer db.Close()

  if err = db.Ping(); err != nil {
    log.Fatal(err)
  }

  // 创建表、插入、查询、更新、删除...
  // 此处省略中间代码
}

基本上就这些。整个流程清晰明了,适合快速构建本地应用或原型系统。注意错误处理不可忽略,尤其是ScanExec后的返回值检查。SQLite轻量且无需服务端,非常适合嵌入式或小型项目使用。

以上就是Golang如何操作SQLite数据库_Golang SQLite数据库CRUD示例的详细内容,更多请关注其它相关文章!


# 数据库文件  # 早教营销推广ppt  # 辽阳外贸seo优化  # 梅州网站营销与推广招聘  # 营销方案推广渠道有哪些  # 网站搜索推广运营费用  # 营销人员网站推广话术  # 企业seo推广排名方案  # 乐山湖南网站优化推广  # 厦门微信网站建设案例  # 莆田绍兴网站建设  # 适用于  # 只需  # 遍历  # 尤其是  # git  # 访问权限  # 内网  # 何为  # 不存在  # 如何使用  # 防止sql注入  # 邮箱  # sql注入  # ai  # go语言  # golang  # github  # go 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: CSS Box Model与弹性按钮:维持布局稳定的动画实践  163邮箱登录密码 163邮箱忘记密码找回  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  J*aScript生成器_j*ascript异步迭代  css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  J*aScript:在map操作中高效处理空数组  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  Selenium Python中处理点击后新窗口加载冻结问题的策略与实践  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  微信语音通话掉线如何解决 微信语音通话稳定优化方法  j*a toString()的覆盖  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  ACG动漫视频网入口 ACG动漫*免费正版观看地址  最新韩小圈网页版登录入口_官网在线观看官方链接  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  网易大神怎么保存别人动态的图片_网易大神动态图片保存方法  Pygame教程:解决用户输入与游戏状态更新不同步问题  妖精漫画网页版登录入口免费_妖精漫画官网主页直接阅读漫画  J*a TimerTask中HashMap意外清空的深层原因与解决方案  Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】  c++中为什么推荐使用using替代typedef_c++现代化类型别名  C++如何比较两个字符串_C++ string compare函数与操作符对比  动漫岛观看全网网 动漫岛在线正版动漫入口  微信客户端如何收红包_微信客户端接收红包使用教程  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  J*a递归快速排序中静态变量导致数据累积问题的解决方案  C#如何安全地从用户上传的XML文件中读取数据? 验证与清理策略  俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  C++的std::mdspan是什么_C++23中用于操作多维数组的非拥有视图  sublime怎么进行远程开发编辑_配置rsub/rmate实现sublime编辑服务器文件  2025-2030年全球乘用车销量预测:新能源成增长主力  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  拼多多赚钱渠道_拼多多收益来源  css元素hover动画延迟生效怎么办_使用animation-delay调整触发时间  Spring Boot嵌入式服务器与J*a EE:功能支持深度解析  yandex入口引擎手机版 yandex安卓版下载入口  红果短剧网页版官网入口 官方最新网址发布  C++ explicit关键字防止隐式转换_C++构造函数安全规范  C#中解析不规范的HTML为XML 常见的坑与解决办法  vivo云服务网页版登录 怎么登录vivo云服务网页版  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧 

搜索