使用zig语言制作简单博客网站(三)后端集成sqlite数据库

zig后端添加sqlite依赖

  • sqlite依赖我们使用开源项目 zig-sqlite
  • build.zig.zon 文件中添加以下代码,COMMIT值我们可以点击仓库的Commits按钮查看复制然后替换

.dependencies = .{
.httpz = .{
.url = "https://github.com/karlseguin/http.zig/archive/fbca868592dc83ee3ee3cad414c62afa266f4866.tar.gz",
.hash = "122089946af5ba1cdfae3f515f0fa1c96327f42a462515fbcecc719fe94fab38d9b8",
},
// 添加sqlite依赖
.sqlite = .{
.url = "https://github.com/vrischmann/zig-sqlite/archive/COMMIT.tar.gz",
// hash值是随便写的,为了占位(长度有要求),实际使用时需要替换成正确的hash值
.hash = "122089946af5ba1cdfae3f515f0fa1c96327f42a462515fbcecc719fe94fab382222",
},
},
// 替换后的COMMIT
// .sqlite = .{
// .url = "https://github.com/vrischmann/zig-sqlite/archive/7f4be7d30b126affb66b390c7825addb1c3506bd.tar.gz",
// .hash = "122089946af5ba1cdfae3f515f0fa1c96327f42a462515fbcecc719fe94fab382222",
// },

然后我们运行zig build下载sqlite依赖并获取到hash值替换,最终替换正确hash结果如下

.dependencies = .{
.httpz = .{
.url = "https://github.com/karlseguin/http.zig/archive/fbca868592dc83ee3ee3cad414c62afa266f4866.tar.gz",
.hash = "122089946af5ba1cdfae3f515f0fa1c96327f42a462515fbcecc719fe94fab38d9b8",
},
// 添加sqlite依赖
.sqlite = .{
.url = "https://github.com/vrischmann/zig-sqlite/archive/7f4be7d30b126affb66b390c7825addb1c3506bd.tar.gz",
.hash = "1220940ae067451e7e6824e9b92baceac93b0bd6fa9ffd315179cc9a7ce5430a46ac",
},
},
  • 将sqlite模块添加到 build.zig 文件中
const sqlite_module = b.dependency("sqlite", .{
.target = target,
.optimize = optimize,
});
exe.root_module.addImport("sqlite", sqlite_module.module("sqlite"));
exe.linkLibrary(sqlite_module.artifact("sqlite"));

创建sqlite数据库文件

  • 我们使用 SQLiteStudio 在项目根目录下创建一个名为 db_zigblog.db 的数据库文件

  • 我们先添加两张表user表和article表,并添加一些预置数据

数据库sql语句
// user
CREATE TABLE user (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username VARCHAR (20) UNIQUE
NOT NULL,
password VARCHAR (100) NOT NULL,
nickname VARCHAR (20)
);
INSERT INTO "user" VALUES (1, 'tingyu', '8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92', '听雨');
// 文章表
CREATE TABLE article (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title VARCHAR (1024) NOT NULL,
description VARCHAR (1024),
content TEXT NOT NULL,
istop INTEGER (2) NOT NULL DEFAULT (0),
created_at DATETIME,
updated_at DATETIME
);
INSERT INTO "article" VALUES (1, 'ubuntu安装教程', '最详细的ubuntu安装教程', 'ubuntu安装教程,ubuntu安装教程,ubuntu安装教程', '2024-8-23 16:08:43', '2024-8-23 16:08:43');
// 分类表
CREATE TABLE category (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR (20) NOT NULL UNIQUE
);

测试zig连接sqlite

  • 先将我们刚才创建的数据库文件db_zigblog.db 复制到 zig-out\bin 目录下,main.zig中添加下面代码做sqlite连接测试,结果如图
// 测试api,测试连接sqlite数据库
router.get("/api/sqlite/user", &getSqliteOneUser);
// 测试api,测试连接sqlite数据库
fn getSqliteOneUser(req: *httpz.Request, res: *httpz.Response) !void {
_ = req;
res.status = 200;
var db = try sqlite.Db.init(.{
.mode = sqlite.Db.Mode{ .File = "db_zigblog.db" },
.open_flags = .{},
.threading_mode = .MultiThread,
});
const query =
\\SELECT id, username, nickname FROM user WHERE id = ?
;
var stmt = try db.prepare(query);
defer stmt.deinit();
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
const allocator = gpa.allocator();
const row = try stmt.oneAlloc(struct {
id: u32,
username: []const u8,
nickname: []const u8,
}, allocator, .{}, .{
.id = 1,
});
if (row) |r| {
std.debug.print("userid: {d}, username: {s}, nickname: {s}", .{ r.id, r.username, r.nickname });
try res.json(.{ .code = 200, .msg = "ok", .data = .{
.id = r.id,
.username = r.username,
.nickname = r.nickname,
} }, .{});
} else {
try res.json(.{ .code = 404, .msg = "not found" }, .{});
}
}

posted @   ※听雨※  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示