sqlite3入门教程(window)

打印 上一主题 下一主题

主题 1931|帖子 1931|积分 5793

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.sqlite3安装

sqlite3官网中下载对应zip,此中tools无论版本是多少,都必要下载。下载之后将两个文件中的内容都解压到同一个文件夹中,将文件夹的地址添加到系统变量中。此电脑—>属性—>高级系统设置—>环境变量—>系统变量,选择PATH环境变量举行编辑,将上述路径添加进去即可。然后后台运行下令sqlite3。下图为安装乐成反应。
   SQLite Download Page
  


 2.sqlite基本语法

 创建数据库

  1. sqlite3 datebase_name
  2. //sqlite3 lht1.db
  3. //这将打开名为 lht1.db 的 SQLite 数据库文件,并进入 SQLite 的交互式 shell 界面,您可以在其中执行 //SQL 查询和命令。
  4. .open datebase_name
  5. //若已经使用sqlite3进入交互shell界面,则使用.open
复制代码
导入\导出数据库

利用 SQLite .dump 点下令来导出完整的数据库在一个文本文件中
  1. sqlite3 testDB.db .dump > testDB.sql
复制代码
上面的下令将转换整个 testDB.db 数据库的内容到 SQLite 的语句中,并将其转储到 ASCII 文本文件 testDB.sql 中。您可以通过简单的方式从生成的 testDB.sql 恢复
  1. $sqlite3 testDB.db < testDB.sql
复制代码
创建表,删除表

  1. CREATE TABLE database_name.table_name(
  2.    column1 datatype  PRIMARY KEY,
  3.    column2 datatype,
  4.    column3 datatype,
  5.    .....
  6.    columnN datatype,
  7. );
复制代码
  主键(PRIMARY KEY),这意味着它必须是唯一的。当你实验向表中插入一个具有与现有行雷同 floors 值的新行时,就会触发唯一性约束。
  

   .tables 下令来验证表是否已乐成创建,该下令用于列出附加数据库中的所有表。
 .schema table_name 下令得到表的完整信息。
  1. DROP TABLE table_name;
  2. //删除需谨慎再谨慎
复制代码
插入

  1. INSERT INTO TABLE_NAME [(column1, column2, column3,...columnN)]  VALUES (value1, value2, value3,...valueN);
复制代码
如果要为表中的所有列添加值,您也可以不必要在 SQLite 查询中指定列名称。
  1. INSERT INTO TABLE_NAME VALUES (value1,value2,value3,...valueN);
复制代码
 利用一个表来填充另外一个表
  1. INSERT INTO first_table_name [(column1, column2, ... columnN)]
  2.    SELECT column1, column2, ...columnN
  3.    FROM second_table_name
  4.    [WHERE condition];
复制代码

 SELECTA语句

SQLite 数据库表中获取数据,以效果表的形式返回数据。这些效果表也被称为效果集。
  1. SELECT column1, column2, columnN FROM table_name;
复制代码
如果全部获取则利用*
  1. SELECT * FROM table_name;
复制代码
UPDATE语句

 UPDATE 查询用于修改表中已有的记录。可以利用带有 WHERE 子句的 UPDATE 查询来更新选定行,否则所有的行都会被更新。
  1. UPDATE table_name
  2. SET column1 = value1, column2 = value2...., columnN = valueN
  3. WHERE [condition];
复制代码

DELETE语句

 DELETE 查询用于删除表中已有的记录。可以利用带有 WHERE 子句的 DELETE 查询来删除选定行,否则所有的记录都会被删除。
  1. DELETE FROM table_name
  2. WHERE [condition];
复制代码

3.如安在VScode中利用sqlite3.h

将sqlite3官网下载的源文件解压后放在项目中,然后将原来下载的sqlite3.dll也添加到项目中。然后利用以下指令编译。


  1. gcc main.cpp -o your_executable -lsqlite3 -lstdc++ -I. -L.
复制代码
4.sqlite3 C/C++函数先容

sqlite3_open

sqlite3_open 函数是 SQLite C/C++ 接口提供的函数之一,用于打开一个 SQLite 数据库文件。以下是对 sqlite3_open 函数的具体解释:


  • 参数

    • filename:要打开的 SQLite 数据库文件的文件名,以 C 字符串形式传递。这个字符串通常是包罗数据库文件路径的字符串。
    • &db:一个指向 sqlite3* 类型指针的指针。该指针将用于存储打开的数据库连接句柄。

  • 返回值

    • int 类型。表示函数执行的效果或错误代码。常见的返回值包罗:

      • SQLITE_OK (0):操纵乐成完成。
      • 其他整数值:表示错误码。SQLite 界说了许多不同的错误码,比方 SQLITE_ERROR 表示通用错误,SQLITE_CANTOPEN 表示无法打开数据库等。


  • 功能

    • sqlite3_open 函数用于打开一个 SQLite 数据库文件,并返回一个表示数据库连接的句柄。
    • 如果指定的数据库文件存在,则将其打开;如果不存在,则会创建一个新的数据库文件。
    • 打开乐成后,可以利用返回的数据库连接句柄来执行后续的数据库操纵,比方执行 SQL 查询、插入数据等。



sqlite3_exec

sqlite3_exec 函数是 SQLite C/C++ 接口提供的用于执行 SQL 语句的函数之一。它允许你执行一个或多个 SQL 语句,并为每个执行效果调用一个回调函数。以下是对 sqlite3_exec 函数的具体解释:


  • 参数

    • sqlite3 *db:一个指向已经打开的 SQLite 数据库连接的指针。这个指针是通过 sqlite3_open 函数打开数据库后返回的。
    • const char *sql:要执行的 SQL 语句,以 C 字符串的形式传递。
    • sqlite_callback:一个函数指针,指向一个回调函数,用于处理惩罚 SQL 执行效果。
    • void *data:一个指针,用于传递给回调函数的数据,通常是一个结构体或其他数据类型的指针。
    • char **errmsg:一个指向字符指针的指针,用于吸收错误信息。如果执行过程中发生错误,将在此指针指向的位置存储错误信息。

  • 返回值

    • int 类型。表示函数执行的效果或错误代码。常见的返回值包罗:

      • SQLITE_OK (0):操纵乐成完成。
      • 其他整数值:表示错误码。SQLite 界说了许多不同的错误码,比方 SQLITE_ERROR 表示通用错误,SQLITE_CONSTRAINT 表示违反约束等。


  • 功能

    • sqlite3_exec 函数用于执行一个或多个 SQL 语句,并为每个执行效果调用一个回调函数。
    • 执行的 SQL 语句可以是任何正当的 SQLite SQL 语句,比方查询语句、插入语句、更新语句等。
    • 每当执行一个 SQL 语句时,将调用指定的回调函数一次,回调函数可以处理惩罚执行效果或执行过程中的其他变乱。
    • 可以通过传递不同的回调函数来实现不同的功能,比方输出查询效果、处理惩罚执行过程中的错误等。

  • 回调函数

    • 回调函数的原型通常为 int callback(void *data, int argc, char **argv, char **azColName),此中:

      • data:指向传递给 sqlite3_exec 函数的 void *data 参数。
      • argc:表示效果集中的列数。
      • argv:一个指向效果集中第一行数据的数组。
      • azColName:一个指向效果集中列名的数组。




sqlite3_stmt*

sqlite3_stmt* 是 SQLite3 中用于表示预编译 SQL 语句的类型。以下是对 sqlite3_stmt* 的具体解释:


  • 类型

    • sqlite3_stmt* 是一个指向 SQLite3 语句对象的指针,它用于表示预编译的 SQL 语句。它的完整界说是 typedef struct sqlite3_stmt sqlite3_stmt;,即 sqlite3_stmt 是一个结构体类型的别名。
    • 预编译的 SQL 语句不会立即执行,而是在后续必要执行时才举行。这样可以减少每次执行 SQL 查询时的解析和优化开销,从而提高执行服从。

  • 作用

    • sqlite3_stmt* 类型的指针用于存储一个颠末预编译的 SQL 语句的信息和状态。预编译的 SQL 语句可以包罗参数,可以重复执行,提高了执行服从。

  • 创建

    • 要创建一个 sqlite3_stmt* 对象,通常必要利用 sqlite3_prepare_v2 或类似的函数来预编译 SQL 语句。这些函数会返回一个 sqlite3_stmt* 对象,该对象表示了预编译后的 SQL 语句。

  • 利用

    • 一旦创建了 sqlite3_stmt* 对象,就可以利用该对象来执行预编译的 SQL 语句。可以通过调用 sqlite3_step 函数来执行 SQL 语句的一次步骤,大概通过调用 sqlite3_finalize 函数来开释 sqlite3_stmt* 对象所占用的资源。

  • 参数绑定

    • sqlite3_stmt* 对象还可以用于将参数绑定到 SQL 语句中。参数绑定允许动态地设置 SQL 语句中的参数值,以防止 SQL 注入攻击,提高了代码的安全性。

  1. sqlite3_stmt* stmt;
  2. const char* sql = "SELECT * FROM table WHERE column = ?";
  3. int result = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
  4. if (result != SQLITE_OK) {
  5.     // 处理错误
  6. }
  7. // 执行其他操作,如参数绑定、执行 SQL 语句等
复制代码
 sqlite3_prepare_v2

  1. int sqlite3_prepare_v2(
  2.   sqlite3 *db,            // SQLite 数据库连接对象
  3.   const char *sql,        // 要编译的 SQL 语句
  4.   int sql_len,            // SQL 语句的长度,如果为负数,则函数会自动计算长度
  5.   sqlite3_stmt **stmt,    // 用于存储编译后的语句对象的指针
  6.   const char **tail       // 指向未使用的部分的指针
  7. );
复制代码



  • 参数

    • sqlite3 *db:一个指向已经打开的 SQLite 数据库连接的指针。
    • const char *sql:要编译的 SQL 语句,以 C 字符串形式传递。
    • int sql_len:可选参数,表示 SQL 语句的长度。如果指定了负数,则函数会自动盘算字符串的长度。
    • sqlite3_stmt **stmt:一个指向 sqlite3_stmt* 类型指针的指针,用于存储编译后的语句对象。
    • const char **tail:一个指向指针的指针,用于吸收未利用的部分的指针。

  • 返回值

    • int 类型,表示函数执行的效果或错误代码。常见的返回值包罗:

      • SQLITE_OK (0):操纵乐成完成。
      • 其他整数值:表示错误码。SQLite 界说了许多不同的错误码,比方 SQLITE_ERROR 表示通用错误,SQLITE_NOMEM 表示内存分配失败等。


  • 功能

    • sqlite3_prepare_v2 函数用于编译一个 SQL 语句,并将其转换为一个预处理惩罚语句对象,以便后续执行。
    • 编译后的预处理惩罚语句对象包罗了 SQL 语句的执行计划、优化信息以及参数绑定等信息。
    • 编译后的预处理惩罚语句对象可以被多次执行,每次执行时都会利用雷同的执行计划和优化信息,从而提高执行服从。



sqlite3_bind_text

sqlite3_bind_text 是 SQLite3 中用于将文本数据绑定到预处理惩罚语句中的函数。它的作用是将一个文本字符串或字节数组绑定到预处理惩罚语句中的参数上,以供后续执行。以下是对 sqlite3_bind_text 函数的具体解释
  1. int sqlite3_bind_text(
  2.   sqlite3_stmt* stmt,     // 预处理语句对象
  3.   int param_index,        // 参数索引,从1开始
  4.   const char* value,      // 要绑定的文本数据
  5.   int value_len,          // 要绑定的文本数据的长度,如果为负数,则函数会自动计算长度
  6.   void (*destructor)(void*) // 可选参数,用于释放 value 内存的回调函数
  7. );
复制代码


  • 参数

    • sqlite3_stmt* stmt:预处理惩罚语句对象,是通过 sqlite3_prepare_v2 函数编译后得到的对象。
    • int param_index:要绑定的参数的索引,从1开始。
    • const char* value:要绑定的文本数据,以 C 字符串形式传递。
    • int value_len:可选参数,表示要绑定的文本数据的长度。如果指定了负数,则函数会自动盘算字符串的长度。
    • void (*destructor)(void*):可选参数,用于指定一个回调函数,在预处理惩罚语句对象被烧毁时开释 value 内存。如果不必要开释内存,可以传递 NULL。

  • 返回值

    • int 类型,表示函数执行的效果或错误代码。常见的返回值包罗:

      • SQLITE_OK (0):操纵乐成完成。
      • 其他整数值:表示错误码。SQLite 界说了许多不同的错误码,比方 SQLITE_ERROR 表示通用错误,SQLITE_NOMEM 表示内存分配失败等。


  • 功能

    • sqlite3_bind_text 函数用于将文本数据绑定到预处理惩罚语句中的参数上。
    • 绑定后的参数可以在执行预处理惩罚语句时被替换成指定的文本数据。
    • 如果必要绑定的文本数据包罗特别字符,如单引号或换行符,SQLite 会自动举行转义处理惩罚,以确保数据的正确性和安全性。


sqlite3_step

sqlite3_step 是 SQLite3 中用于执行预处理惩罚语句的函数,它的作用是执行编译好的预处理惩罚语句,并返回执行效果。以下是对 sqlite3_step 函数的具体解释:
  1. int sqlite3_step(sqlite3_stmt* stmt);
复制代码


  • 参数

    • sqlite3_stmt* stmt:预处理惩罚语句对象,是通过 sqlite3_prepare_v2 函数编译后得到的对象。

  • 返回值

    • int 类型,表示函数执行的效果或错误代码。常见的返回值包罗:

      • SQLITE_ROW:表示执行乐成,而且查询语句返回了一行数据。
      • SQLITE_DONE:表示执行乐成,而且查询语句执行完毕,没有返回更多的数据。
      • 其他整数值:表示错误码。SQLite 界说了许多不同的错误码,比方 SQLITE_ERROR 表示通用错误,SQLITE_CONSTRAINT 表示违反约束等。


  • 功能

    • sqlite3_step 函数用于执行预处理惩罚语句,并返回执行效果。
    • 在执行期间,预处理惩罚语句会被执行一次或多次,每次调用 sqlite3_step 函数执行一次查询步骤。
    • 当调用 sqlite3_step 函数乐成时,返回值为 SQLITE_ROW 或 SQLITE_DONE。SQLITE_ROW 表示查询语句返回了一行数据,而 SQLITE_DONE 表示查询执行完毕。
    • 在执行 SELECT 查询时,sqlite3_step 函数将返回 SQLITE_ROW,表示查询效果包罗一行数据,然后你可以利用相干的函数(比方 sqlite3_column_int、sqlite3_column_text 等)来获取该行数据的具体内容。然后,你可以继续调用 sqlite3_step 函数来获取下一行数据,直到它返回 SQLITE_DONE,表示已经处理惩罚完所有的查询效果。

  1. sqlite3_stmt *stmt;
  2. const char *sql = "SELECT column1, column2 FROM table";
  3. // 准备 SQL 语句
  4. int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
  5. if (rc != SQLITE_OK) {
  6.     // 错误处理
  7. }
  8. // 执行查询
  9. while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
  10.     // 读取查询结果中的每一行数据
  11.     int column1 = sqlite3_column_int(stmt, 0);
  12.     const unsigned char *column2 = sqlite3_column_text(stmt, 1);
  13.     // 处理查询结果
  14.     // 例如,将数据存储到变量中,打印到控制台等
  15. }
  16. // 检查是否处理完所有结果
  17. if (rc != SQLITE_DONE) {
  18.     // 错误处理
  19. }
  20. // 释放语句对象
  21. sqlite3_finalize(stmt);
复制代码

sqlite3_finalize

sqlite3_finalize 函数用于开释预处理惩罚语句对象,它的作用是开释由 sqlite3_prepare_v2 函数创建的预处理惩罚语句对象所占用的资源,并清算相干的状态。以下是对 sqlite3_finalize 函数的具体解释:
  1. int sqlite3_finalize(sqlite3_stmt* stmt);
复制代码


  • 参数

    • sqlite3_stmt* stmt:要开释的预处理惩罚语句对象,是通过 sqlite3_prepare_v2 函数编译后得到的对象。

  • 返回值

    • int 类型,表示函数执行的效果或错误代码。常见的返回值包罗:

      • SQLITE_OK (0):操纵乐成完成。
      • 其他整数值:表示错误码。SQLite 界说了许多不同的错误码,比方 SQLITE_ERROR 表示通用错误,SQLITE_MISUSE 表示参数错误等。


  • 功能

    • sqlite3_finalize 函数用于开释预处理惩罚语句对象所占用的资源,并清算相干的状态。
    • 调用 sqlite3_finalize 函数后,预处理惩罚语句对象将不再可用,不能再次执行。通常环境下,必要在利用完预处理惩罚语句对象后调用 sqlite3_finalize 函数举行开释,以避免资源泄漏。
    • 如果预处理惩罚语句对象已经执行过并返回了效果,那么在调用 sqlite3_finalize 函数后,还可以通过其他函数来获取最终的执行效果。


sqlite3_close

sqlite3_close 函数用于关闭 SQLite 数据库连接,开释相干资源,并将数据库连接对象关闭。以下是对 sqlite3_close 函数的具体解释:
  1. int sqlite3_close(sqlite3* db);
复制代码


  • 参数

    • sqlite3* db:要关闭的 SQLite 数据库连接对象。

  • 返回值

    • int 类型,表示函数执行的效果或错误代码。常见的返回值包罗:

      • SQLITE_OK (0):操纵乐成完成。
      • 其他整数值:表示错误码。SQLite 界说了许多不同的错误码,比方 SQLITE_ERROR 表示通用错误,SQLITE_BUSY 表示数据库忙等。


  • 功能

    • sqlite3_close 函数用于关闭 SQLite 数据库连接,并开释相干的资源。
    • 调用 sqlite3_close 函数后,将不再可以或许利用指定的数据库连接对象举行数据库操纵。
    • 在调用 sqlite3_close 函数之前,通常必要确保所有相干的预处理惩罚语句对象都已经开释,而且没有任何未完成的变乱操纵。

sqlite3_column_int

sqlite3_column_int 是 SQLite3 中用于从效果集中获取整数类型数据的函数。以下是对 sqlite3_column_int 函数的具体解释:
  1. int sqlite3_column_int(sqlite3_stmt* pStmt, int columnIndex);
复制代码


  • 参数

    • sqlite3_stmt* pStmt:预处理惩罚语句对象,通过 sqlite3_prepare_v2 编译后得到的对象。
    • int columnIndex:要获取数据的列索引,从0开始。

  • 返回值

    • int 类型,表示从效果集中获取的整数值。如果列中的数据类型不是整数类型,则返回值将被转换为整数。

  • 功能

    • sqlite3_column_int 函数用于从预处理惩罚语句执行效果中获取整数类型数据。
    • 它担当两个参数,第一个参数是预处理惩罚语句对象,第二个参数是要获取数据的列索引。
    • 函数返回指定列的整数值。如果列中的数据类型不是整数类型,SQLite 会实验将其转换为整数类型。如果无法转换,返回值为0。

5.利用上面函数搭建基本功能

利用这些基础函数搭建基本函数举行对数据库的操纵,如,打开创建一个数据库,新键表,插入数据,删除数据,更改数据,查看数据。
打开一个数据库

  1. bool openDatabase(const char* filename) {
  2.         int result = sqlite3_open(filename, &db);
  3.         if (result != SQLITE_OK) {
  4.             std::cerr << "Failed to open database: " << sqlite3_errmsg(db) << std::endl;
  5.             return false;
  6.         }
  7.         std::cout << "Database opened successfully." << std::endl;
  8.         return true;
  9.     }
复制代码
新建表

  1. bool createTable() {
  2.         char *errMsg = nullptr;
  3.         std::string sql = "CREATE TABLE IF NOT EXISTS floors ("
  4.                         "floors char(50) primary key NOT NULL,"
  5.                         "time_id int NOT NULL"
  6.                         ");";
  7.         
  8.         int result = sqlite3_exec(db, sql.c_str(), nullptr, nullptr, &errMsg);
  9.         if (result != SQLITE_OK) {
  10.             std::cerr << "SQL error: " << errMsg << std::endl;
  11.             sqlite3_free(errMsg);
  12.             return false;
  13.         }
  14.         return true;
  15.     }
复制代码

插入数据

  1. bool insertDatabase(const std::string& floors, const int time_id) {
  2.         if (!db) {
  3.             std::cerr << "Database is not open." << std::endl;
  4.             return false;
  5.         }
  6.         std::string sql = "INSERT INTO floors (floors, time_id) VALUES (?, ?);";
  7.         sqlite3_stmt* stmt;
  8.         int result = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr);
  9.         if (result != SQLITE_OK) {
  10.             std::cerr << "Failed to prepare statement: " << sqlite3_errmsg(db) << std::endl;
  11.             return false;
  12.         }
  13.         result = sqlite3_bind_text(stmt, 1, floors.c_str(), -1, SQLITE_STATIC);
  14.         result |= sqlite3_bind_int(stmt, 2, time_id);
  15.         if (result != SQLITE_OK) {
  16.             std::cerr << "Failed to bind parameters: " << sqlite3_errmsg(db) << std::endl;
  17.             sqlite3_finalize(stmt);
  18.             return false;
  19.         }
  20.         result = sqlite3_step(stmt);
  21.         if (result != SQLITE_DONE) {
  22.             std::cerr << "Failed to execute statement: " << sqlite3_errmsg(db) << std::endl;
  23.             sqlite3_finalize(stmt);
  24.             return false;
  25.         }
  26.         std::cout << "Database updated successfully." << std::endl;
  27.         sqlite3_finalize(stmt);
  28.         return true;
  29.     }
复制代码



删除对应数据

  1. bool deleteDatabase(const std::string& condition) {
  2.         sqlite3_stmt *stmt;
  3.         const char *tail;
  4.         std::string sql = "DELETE FROM floors WHERE " + condition + ";";
  5.         int result = sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, &tail);
  6.         if (result != SQLITE_OK) {
  7.             std::cerr << "SQL error: " << sqlite3_errmsg(db) << std::endl;
  8.             sqlite3_close(db);
  9.             return false;
  10.         }
  11.         result = sqlite3_step(stmt);
  12.         if (result != SQLITE_DONE) {
  13.             std::cerr << "Execution failed: " << sqlite3_errmsg(db) << std::endl;
  14.             sqlite3_finalize(stmt);
  15.             sqlite3_close(db);
  16.             return false;
  17.         }
  18.         std::cout << "Database delete successfully." << std::endl;
  19.         sqlite3_finalize(stmt);
  20.         return true;
  21.     }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表