数据库编程——sqlite3

目录

一、启动与退出

二、数据库创建与维护

[三、标准 SQL 语句](#三、标准 SQL 语句)

创建表:

删除表:

向表中增加数据:

查询表中的数据:

修改表中数据:

删除表中数据:

四、补充内容

数据库编程

一、sqlite3_open

二、sqlite3_exec

三、sqlite3_close

代码示例


一、启动与退出

  1. 启动 SQLite3:
    • 使用命令sqlite3 xxx.db可以打开一个名称为xxx.db的本地数据库。出现sqlite>提示符表明数据库管理系统启动。
    • 例如:sqlite3 test.db
  2. 退出数据库:
    • 使用.q命令退出。如果一直出现...>符号,则写;结束当前输入后再使用.q命令退出。

二、数据库创建与维护

  1. 创建一个数据库:
    • 方法一:使用touch xxx.db创建一个空文件,然后使用sqlite3 xxx.db启动数据库管理系统并关联该文件。
    • 方法二:直接使用sqlite3 xxx.db,如果文件不存在,会自动创建一个新的数据库文件。
  2. 系统维护命令:
    • .help:列出所有相关的系统维护命令,都是以 "." 开头。
    • .database:列出当前库和系统中哪个文件在关联。
    • .tables:列出当期数据库中的所有表。
    • .schema xxx:列出当前指定的xxx表结构。
    • 数据导出:sqlite3 test.db.dump > 123.sql,将数据库名称为test的数据库整体导出到脚本中。
    • 数据导入:sqlite3 xxx.db < test.sql,将脚本中的数据导入到数据库xxx.db中。

这里的 > :表示输出重定向 < :表示输入重定向。

三、标准 SQL 语句

创建表:

  • 语法:create table 表名(表字段 1 类型,表字段 2 类型,...)
  • 支持的数据类型有int(整数)、text(无大小限制)、real(小数)、blob(二进制数据),默认是text类型。
  • 例如:create table user(id int,name char,age int)

删除表:

  • 语法:drop table 表名
  • 例如:drop table user

向表中增加数据:

  • 语法一:insert into 表名 (字段名称) values (值名称)
  • 例如:insert into user (id,age) values (1,10)
  • 语法二:insert into 表名 values(值 1,值 2,...)
  • 例如:insert into user values(3,"wang",11)

查询表中的数据:

  • 语法:select 列名 from 表名 [条件],条件不是必须。
  • 例如:
    • select * from user(查看所有列)。
    • select id from user
    • select id,name from user where age<25
    • where name like '三一'%_为通配符)。
    • select * from user where age>20 or age<50 order by age desc limit 2

修改表中数据:

  • 语法:update 表名 set 表字段 = 值 [满足条件]
  • 例如:
    • update user set id = 1 where name = 'li'
    • update user set id = 1 where name = "li" and passwd = "123"
    • update user set id = 2 where name = "li" or name = "zhao"

删除表中数据:

  • 语法:delete from 表名 [满足条件]
  • 例如:
    • delete from user(删除表中所有数据)。
    • delete from user where id = 1(删除id=1的数据)。
    • delete from user where id =1 and name = "zhang"
    • delete from user where id = 1 or id = 2

四、补充内容

  1. 时间列的处理:
    • 可以在表中添加时间列,例如CREATE TABLE user1(id int,name char,age int,dt datetime)
    • 插入时间值可以使用datetime('now','+8 hours')获取当前时间加上 8 小时的时间值。
    • 例如:insert into user1 values (2,'张三',23,datetime('now','+8 hours'))
  2. 自动增长列:
    • 创建表时可以将一个整数列设置为主键并指定自增长属性,例如CREATE TABLE user3(id INTEGER PRIMARY KEY ASC,name char,age int,dt datetime)
    • 插入数据时可以使用NULL作为该列的值,数据库会自动分配一个自增长的值。例如:insert into user3 (NULL,'李四',23,datetime('now'))

数据库编程

一、sqlite3_open

cpp 复制代码
int sqlite3_open(const char *filename, sqlite3 **ppDb);
  1. 功能:这个函数用于打开一个 SQLite 数据库文件。如果数据库文件不存在,SQLite 可能会根据具体情况创建一个新的数据库文件。
  2. 参数:
    • filename:指向要打开的数据库文件名的字符串。可以是相对路径或绝对路径。
    • ppDb:是一个指向 sqlite3 结构体指针的指针。函数成功执行后,这个指针将指向一个打开的数据库连接。
  3. 返回值:
    • 如果成功打开数据库,函数返回 SQLITE_OK(0)。
    • 如果发生错误,返回一个错误码。

二、sqlite3_exec

cpp 复制代码
int sqlite3_exec(sqlite3*, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg );
  1. 功能:用于执行一条或多条 SQL 语句。可以执行各种 SQL 操作,如创建表、插入数据、查询数据、更新数据、删除数据等。
  2. 参数:
    • sqlite3*:一个打开的数据库连接指针。
    • sql:要执行的 SQL 语句字符串。可以是单个 SQL 语句或多个 SQL 语句的序列,以分号分隔。
    • callback:一个回调函数,每当执行一个查询语句并返回结果时,这个回调函数会被调用。如果不需要处理查询结果,可以设置为 NULL
    • void *:一个用户提供的指针,可以在回调函数中使用,通常用于传递上下文信息。
    • errmsg:如果发生错误,这个指针将被设置为指向一个包含错误信息的字符串。
  3. 返回值:
    • 如果成功执行 SQL 语句,函数返回 SQLITE_OK(0)。
    • 如果发生错误,返回一个错误码。

三、sqlite3_close

cpp 复制代码
int sqlite3_close(sqlite3*);
  1. 功能:用于关闭一个之前打开的 SQLite 数据库连接。
  2. 参数:
    • sqlite3*:要关闭的数据库连接指针。
  3. 返回值:
    • 如果成功关闭数据库连接,函数返回 SQLITE_OK(0)。
    • 如果发生错误,返回一个错误码。

代码示例

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

// 定义回调函数 show,用于处理查询结果
int show(void* arg, int col, char** result, char** title)
{
    // static 变量 flag,用于标记是否是第一次调用该函数
    static int flag = 0;
    int i;

    // 如果是第一次调用
    if (flag == 0)
    {
        // 遍历列数
        for (i = 0; i < col; i++)
        {
            // 打印列名
            printf("%s\t", title[i]);
        }
        // 换行
        printf("\n");
        // 将 flag 置为 1,表示不是第一次调用了
        flag = 1;
    }

    // 遍历列数
    for (i = 0; i < col; i++)
    {
        // 打印查询结果中的每一项
        printf("%s\t", result[i]);
    }
    // 换行
    printf("\n");

    // 返回 0,表示继续处理下一行结果(如果有)
    return 0;
}

int main()
{
    sqlite3* db;
    // 尝试打开数据库文件 /home/linux/Desktop/0904/aaa.db,并将数据库连接指针存储在 db 中
    int ret = sqlite3_open("/home/linux/Desktop/0904/aaa.db", &db);
    if (ret!= SQLITE_OK)
    {
        // 如果打开失败,打印错误信息
        fprintf(stderr, "sqlite3_open error,%s\n", sqlite3_errstr(ret));
        // 关闭数据库连接
        sqlite3_close(db);
        return 1;
    }

    char *errmsg;
    // 定义 SQL 查询语句,这里是查询表 user 中的所有数据
    char sqlite3_cmd[] = "select * from user;";
    // 执行 SQL 查询语句,将查询结果通过回调函数 show 进行处理,参数 NULL 表示没有额外的用户数据传递给回调函数,errmsg 用于存储错误信息
    ret = sqlite3_exec(db, sqlite3_cmd, show, NULL, &errmsg);
    if (ret!= SQLITE_OK)
    {
        // 如果执行查询失败,打印错误信息
        fprintf(stderr, "exec error,%s\n", errmsg);
        // 释放错误信息占用的内存
        sqlite3_free(errmsg);
        // 关闭数据库连接
        sqlite3_close(db);
        return 1;
    }

    // 关闭数据库连接
    sqlite3_close(db);

    // 打印 "Hello World!"
    printf("Hello World!\n");
    return 0;
}
相关推荐
q***46522 分钟前
在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能
数据库·django·sqlite
不光头强3 小时前
Spring框架的事务管理
数据库·spring·oracle
百***92026 小时前
【MySQL】MySQL库的操作
android·数据库·mysql
q***76666 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
信仰_2739932436 小时前
Redis红锁
数据库·redis·缓存
人间打气筒(Ada)6 小时前
Centos7 搭建hadoop2.7.2、hbase伪分布式集群
数据库·分布式·hbase
心灵宝贝6 小时前
如何在 Mac 上安装 MySQL 8.0.20.dmg(从下载到使用全流程)
数据库·mysql·macos
奋斗的牛马7 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
忧郁的橙子.8 小时前
一、Rabbit MQ 初级
服务器·网络·数据库
杰杰7988 小时前
SQL 实战:用户访问 → 下单 → 支付全流程转化率分析
数据库·sql