SQLite3学习笔记4:打开和关闭数据库 + 创建表(C API)

前置知识(C API 核心)

  1. 编译依赖 :Ubuntu 下编译 C 代码必须链接 sqlite3 库(-lsqlite3),否则会报 "未定义引用" 错误;
  2. 核心数据类型 :sqlite3 *是数据库句柄(嵌入式中建议设为静态 / 全局,避免频繁打开 / 关闭);
  3. 错误处理 :所有 sqlite3 函数返回值都是 int 型,SQLITE_OK(0)表示成功,其他值为错误码;
  4. 错误信息 :sqlite3_errmsg(db)返回错误描述字符串,是调试定位问题的核心手段。

核心函数详解

函数名 原型 核心作用 注意事项
sqlite3_open int sqlite3_open(const char *filename, sqlite3 **ppDb); 打开 / 创建数据库 路径需是可写路径(如/mnt/embedded_db.db),ppDb是输出参数
sqlite3_close int sqlite3_close(sqlite3 *db); 关闭数据库 必须调用,否则内存泄漏;关闭前需确保无未完成的 SQL 操作
sqlite3_exec int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*,int,char**,char**), void *arg, char **errmsg); 执行 SQL 语句 通用接口,创建表 / 插入 / 更新 / 删除时无需回调函数,callback传 NULL
sqlite3_errmsg const char *sqlite3_errmsg(sqlite3 *db); 获取错误信息 错误时打印,调试必备

完整 C 代码示例

创建文件sqlite3_c_demo1.c:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

int main(int argc, char *argv[])
{
    sqlite3 *db   = NULL;      // 数据库句柄(嵌入式中建议设为静态/全局)
    char *err_msg = NULL;      // 错误信息缓冲区(需手动释放)
    int ret       = SQLITE_OK; // SQLite函数返回值

    // 1. 打开/创建数据库(路径和命令行的embedded_db.db一致)
    ret = sqlite3_open("embedded_db.db", &db);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 打开数据库失败: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db); // 即使失败也要尝试关闭,避免资源泄漏
        return -1;
    }
    printf("[INFO] 数据库打开/创建成功\n");

    // 2. 定义创建表的SQL语句(和命令行的表结构完全一致)
    const char *create_table_sql = "CREATE TABLE IF NOT EXISTS device_params ("
                                   "id INTEGER PRIMARY KEY AUTOINCREMENT, "
                                   "param_name TEXT NOT NULL, "
                                   "param_value REAL NOT NULL, "
                                   "update_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);";

    // 3. 执行创建表的SQL语句(callback=NULL,arg=NULL)
    ret = sqlite3_exec(db, create_table_sql, NULL, NULL, &err_msg);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 创建表失败: %s\n", err_msg);
        sqlite3_free(err_msg); // 释放错误信息缓冲区
        sqlite3_close(db);
        return -1;
    }
    printf("[INFO] 表创建成功(已存在则忽略)\n");

    // 4. 关闭数据库
    ret = sqlite3_close(db);
    if (ret != SQLITE_OK)
    {
        fprintf(stderr, "[ERROR] 关闭数据库失败: %s\n", sqlite3_errmsg(db));
        return -1;
    }
    printf("[INFO] 数据库关闭成功\n");

    return 0;
}

操作步骤

  1. 编译代码(必须链接 sqlite3 库)
bash 复制代码
gcc sqlite3_c_demo1.c -o sqlite3_c_demo1 -lsqlite3
  1. 运行程序
bash 复制代码
./sqlite3_c_demo1

输出如下:

bash 复制代码
[INFO] 数据库打开/创建成功
[INFO] 表创建成功(已存在则忽略)
[INFO] 数据库关闭成功
  1. 验证表是否创建成功(用命令行交叉验证):
bash 复制代码
sqlite3 embedded_db.db ".tables"

输出如下:

bash 复制代码
device_params
相关推荐
ClickHouseDB8 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_639906948 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
时间售卖铺9 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw9 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社10 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
lbb 小魔仙11 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
apple-mapping11 小时前
网络RTK定位学习总结
学习·网络rtk
captain37612 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你021412 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
楚山之石12 小时前
【Lancet Neurology 】多发性硬化认知障碍的 SDMT 筛查、灰质萎缩标志与认知康复循证路径
图像处理·人工智能·学习·mri