嵌入式数据库概念和基本命令的使用


前言

本篇文章将为大家讲解嵌入式数据库的使用,嵌入式数据的话主要是使用sqlite数据库。

一、sqlite数据库概念

SQLite 是一种轻量级的嵌入式关系型数据库管理系统(RDBMS),它被广泛应用于各种应用程序中,从移动应用到桌面应用再到 Web 应用。以下是关于 SQLite 数据库的一些概念解释:

  1. 嵌入式数据库管理系统(Embedded Database Management System):SQLite 是一种嵌入式数据库,这意味着它不需要独立的服务器进程来管理数据库。相反,SQLite 数据库引擎被直接集成到应用程序中,数据库以文件的形式存储在主机文件系统中。

  2. 关系型数据库管理系统(RDBMS):SQLite 是关系型数据库管理系统的一种,这意味着它使用表、行和列来组织和存储数据。它支持 SQL(Structured Query Language)作为与数据库交互的标准语言。

  3. 轻量级(Lightweight):SQLite 设计用于在资源有限的环境下运行,并且具有小巧、快速和高效的特点。它的库文件大小相对较小,且资源消耗较低,适用于嵌入式系统和移动设备等场景。

  4. 零配置(Zero Configuration):使用 SQLite 时,不需要进行复杂的配置或管理。只需包含 SQLite 库并在应用程序中指定数据库文件的路径,即可开始使用。

  5. 单用户访问(Single-User Access):SQLite 不支持多用户同时访问同一数据库文件。只有一个用户(即应用程序)可以连接到数据库并对其进行读写操作。这在某些情况下可能是限制,但也确保了数据的完整性和一致性。

  6. 跨平台性(Cross-Platform):SQLite 可以在多种操作系统上运行,包括 Windows、macOS、Linux 等,因此它是一个跨平台的解决方案。

  7. 事务支持(Transaction Support):SQLite 支持事务,允许将一系列数据库操作组合成一个逻辑单元,要么全部成功执行,要么全部失败回滚。这有助于确保数据的一致性和完整性。

  8. 自包含性(Self-Contained):SQLite 数据库被存储在单个文件中,并且所有的数据库操作都在该文件内执行。这种自包含性使得 SQLite 数据库易于传输、备份和维护。

总的来说,SQLite 是一种简单、快速、易于使用的数据库解决方案,特别适用于对数据库性能要求不高、规模较小的应用程序。

二、sqlite数据库命令分类和使用

1.命令分类

当谈到 SQLite 数据库命令时,可以将其分为两类:系统命令和 SQLite 特定的命令。

1. 系统命令:

系统命令是在命令行界面或终端中执行的命令,用于管理 SQLite 数据库和与操作系统交互。这些命令通常不是 SQLite 引擎的一部分,而是与 SQLite 交互的外部工具或系统级命令。

一些常见的系统命令包括:

  • sqlite3命令:用于启动 SQLite 数据库的命令行 shell,使用户能够与 SQLite 数据库进行交互。
  • 操作系统命令:例如在 Unix/Linux 系统中的 ls、cd 等命令,或在 Windows 中的 dir、cd 等命令,用于管理文件和目录。

2. SQLite 命令:

SQLite 命令是在 SQLite 数据库命令行 shell 中执行的命令,用于管理数据库、执行查询、事务控制等操作。这些命令是 SQLite 引擎的一部分,直接与 SQLite 数据库进行交互。

一些常见的 SQLite 命令包括:

  • DDL 命令(数据定义语言):用于定义、修改和删除数据库对象,例如 CREATE TABLE、ALTER TABLE、DROP TABLE 等。
  • DML 命令(数据操作语言):用于执行对数据库中的数据进行增、删、改的操作,例如 INSERT、UPDATE、DELETE。
  • DQL 命令(数据查询语言):用于执行对数据库中的数据进行查询的操作,例如 SELECT。
  • 事务控制命令:用于管理事务的开始、提交、回滚等,例如 BEGIN TRANSACTION、COMMIT、ROLLBACK。

这些 SQLite 命令是在 SQLite shell 中执行的,它们提供了一种直接与 SQLite 数据库进行交互的方式,并且可以通过脚本或编程语言中的 SQLite API 进行扩展和自动化。

2.系统命令的使用

1.查看帮助文档:

.help

在这里插入图片描述
2.显示当前输出模式:

.show

在这里插入图片描述
3.打开/关闭输出展示模式(可选为列模式或者显示模式):

.mode column  -- 列模式
.mode line    -- 行模式
.mode csv     -- CSV 模式

4.退出 SQLite3:

.quit

在这里插入图片描述

3.sqlite命令的使用

1.创建数据库:

sqlite3 mydatabase.db

这个命令会创建一个名为mydatabase.db的SQLite数据库文件,并打开一个SQLite shell供你进行交互式操作。
在这里插入图片描述
2.创建表:

CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    username TEXT,
    email TEXT UNIQUE,
    age INTEGER
);

这个命令会在数据库中创建一个名为users的表,包含id、username、email和age四个列。id列是主键,并且email列是唯一的。

在这里插入图片描述
3.插入数据:

INSERT INTO users (username, email, age) VALUES ('John', 'john@example.com', 30);

在这里插入图片描述
4.查询数据:

SELECT * FROM users;

这个命令会从users表中检索所有数据。

在这里插入图片描述
5.更新数据:

UPDATE users SET age = 31 WHERE username = 'John';

在这里插入图片描述
6.删除数据:

DELETE FROM users WHERE username = 'John';

在这里插入图片描述
7.退出SQLite shell:

.quit

三、sqlite C语言函数的使用和编程方法

SQLite提供了一组C语言API函数,使开发者可以在C程序中使用SQLite数据库。下面是一些常用的SQLite C语言函数以及它们的意思和用法:

  1. sqlite3_open()

    • 作用:用于打开一个SQLite数据库连接。
    • 参数:
      • const char *filename:数据库文件名。
      • sqlite3 **ppDb:指向sqlite3指针的指针,用于存储数据库连接对象。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。
  2. sqlite3_close()

    • 作用:关闭先前由sqlite3_open()函数打开的数据库连接。
    • 参数:
      • sqlite3 *db:数据库连接对象。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。
  3. sqlite3_exec()

    • 作用:执行SQL语句,并对每个执行的结果调用一个回调函数。
    • 参数:
      • sqlite3 *db:数据库连接对象。
      • const char *sql:要执行的SQL语句。
      • int (*callback)(void*, int, char**, char**):回调函数,用于处理执行结果。
      • void *data:传递给回调函数的数据。
      • char **errmsg:指向错误信息的指针,若执行过程中发生错误,会将错误信息存储在这里。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。
  4. sqlite3_prepare_v2()

    • 作用:编译SQL语句,创建一个准备语句对象。
    • 参数:
      • sqlite3 *db:数据库连接对象。
      • const char *sql:要编译的SQL语句。
      • int sql_len:SQL语句的长度(如果为-1,则SQLite会自动计算)。
      • sqlite3_stmt **stmt:指向sqlite3_stmt指针的指针,用于存储准备语句对象。
      • const char **pzTail:指向剩余未处理的SQL语句的指针。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。
  5. sqlite3_step()

    • 作用:执行准备好的SQL语句的下一步操作。
    • 参数:
      • sqlite3_stmt *stmt:准备语句对象。
    • 返回值:若操作成功,返回SQLITE_ROW(表示查询结果行)或SQLITE_DONE(表示执行完成);否则返回其他错误码。
  6. sqlite3_bind_XXX()

    • 作用:绑定参数到准备好的SQL语句中。
    • 参数:
      • sqlite3_stmt *stmt:准备语句对象。
      • int idx:参数索引,从1开始。
      • XXX value:要绑定的参数值,XXX代表不同数据类型,例如sqlite3_bind_int()、sqlite3_bind_text()等。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。
  7. sqlite3_column_XXX()

    • 作用:获取查询结果中指定列的值。
    • 参数:
      • sqlite3_stmt *stmt:准备语句对象。
      • int idx:列索引,从0开始。
    • 返回值:列的值,XXX代表不同数据类型,例如sqlite3_column_int()、sqlite3_column_text()等。
  8. sqlite3_finalize()

    • 作用:释放准备语句对象所占用的资源。
    • 参数:
      • sqlite3_stmt *stmt:准备语句对象。
    • 返回值:若操作成功,返回SQLITE_OK;否则返回其他错误码。

这些是SQLite C语言API中的一些常用函数,通过它们可以在C程序中实现对SQLite数据库的操作。

#include <stdio.h>
#include <sqlite3.h>

// 回调函数用于处理查询结果
int callback(void *data, int argc, char **argv, char **azColName){
    int i;
    printf("%s: ", (const char*)data);
    for(i = 0; i < argc; i++){
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main(int argc, char* argv[]) {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;

    // 打开数据库连接
    rc = sqlite3_open("test.db", &db);
    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        return(0);
    } else {
        fprintf(stderr, "Opened database successfully\n");
    }

    // 创建表
    const char *sql_create = "CREATE TABLE IF NOT EXISTS COMPANY("  \
                             "ID INT PRIMARY KEY     NOT NULL," \
                             "NAME           TEXT    NOT NULL," \
                             "AGE            INT     NOT NULL," \
                             "ADDRESS        CHAR(50)," \
                             "SALARY         REAL );";

    rc = sqlite3_exec(db, sql_create, callback, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Table created successfully\n");
    }

    // 插入数据
    const char *sql_insert = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
                             "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
                             "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
                             "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); "     \
                             "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
                             "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
                             "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
                             "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";

    rc = sqlite3_exec(db, sql_insert, callback, 0, &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Records created successfully\n");
    }

    // 查询数据
    const char *sql_select = "SELECT * from COMPANY";
    printf("Selecting records...\n");
    rc = sqlite3_exec(db, sql_select, callback, (void*) "Select", &zErrMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }

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

这个示例程序完成了以下操作:

打开一个名为"test.db"的数据库连接。

创建一个名为"COMPANY"的表,包含ID、NAME、AGE、ADDRESS和SALARY字段。

插入一些记录到"COMPANY"表中。

查询"COMPANY"表中的所有记录,并打印输出。

关闭数据库连接。

你可以根据需要修改SQL语句以及数据处理部分来完成其他操作,比如更新数据、删除数据等。

总结

本篇文章主要讲解了数据库的概念和数据库的一些基本命令的使用,这篇文章就讲解到这里,下篇文章我们继续讲解。

相关推荐

  1. 嵌入定时器概念

    2024-05-14 08:52:04       69 阅读
  2. Git 基本概念使用方式

    2024-05-14 08:52:04       55 阅读
  3. TensorFlow 基本概念使用场景

    2024-05-14 08:52:04       57 阅读
  4. Git 基本概念使用方式

    2024-05-14 08:52:04       56 阅读
  5. TensorFlow 基本概念使用场景。

    2024-05-14 08:52:04       60 阅读
  6. Git 基本概念使用方式。

    2024-05-14 08:52:04       65 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-14 08:52:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-14 08:52:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-14 08:52:04       82 阅读
  4. Python语言-面向对象

    2024-05-14 08:52:04       91 阅读

热门阅读

  1. 【网络】tcp如何保证可靠 总结

    2024-05-14 08:52:04       30 阅读
  2. $.ajax异步请求没执行结束,后面的代码就执行了

    2024-05-14 08:52:04       28 阅读
  3. Golong中的http.Transport详解

    2024-05-14 08:52:04       30 阅读
  4. [开发] ohmyzsh的git插件常用git简写命令

    2024-05-14 08:52:04       30 阅读
  5. Ubuntu20.04中的Pyqt4

    2024-05-14 08:52:04       35 阅读
  6. Jupyter集成AI环境搭建@miniconda@FreeBSD

    2024-05-14 08:52:04       30 阅读
  7. git之从整个版本中彻底删除文件)

    2024-05-14 08:52:04       31 阅读
  8. 十大排序算法

    2024-05-14 08:52:04       36 阅读
  9. 混合使用MFC与QT的深度技术分析

    2024-05-14 08:52:04       30 阅读