SQLite
SQLite是一款轻量级数据库,是一个关系型数据库(RDBMS)管理系统,它包含在一个相对小的C库中,
实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎。
在很多嵌入式产品中使用了它,
它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
它能够支持Windows/Linux/Unix/Android/IOS等等主流的操作系统,同时能够跟很多程序语言相结合,
比如C#、PHP、Java等, 更重要的是
SQLite文件格式稳定,跨平台且向后兼容,开发人员保证至少在2050年之前保持这种格式。
而且速度极快,目前是在世界上最广泛部署的SQL
数据库,据官网统计活跃使用的SQLite数据库超过1万亿,
更重要的是SQLite源代码不受版权限制,任何人都可以免费使用于任何目的。
大家可以参考官网的介绍: https://www.sqlite.org/index.html
SQLite安装
Windows
Windows推荐安装 sqlitestudio
可视化操作数据库,不管是设计数据库还是查看数据库数据都很好用。
Linux
Linux上面安装sqlite和工具包
sudo apt-get -y install sqlite3
sudo apt-get install libsqlite3-dev
交叉编译SQLite
参考
https://taotaodiy-linux.readthedocs.io/en/latest/sql/crosssqlite.html
运行环境
sudo apt-get -y install sqlite3
SQLite使用
SQLite提供了一组点命令来操作SQLite数据库。
在终端输入 sqlite3 会进入SQLite终端,输入 .help 就可以查询这些点命令
➜ ~ sqlite3
SQLite version 3.27.2 2019-02-25 16:06:06
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILE name" to reopen on a persistent database.
sqlite> .help
.archive ... # 管理SQL存档
.auth ON|OFF # 显示授权者回调
.backup ?DB? FILE # 备份 DB 数据库(默认是 “main”)到 FILE 文件
.bail on|off Stop after hitting an error. Default OFF
.binary on|off Turn binary output on or off. Default OFF
.cd DIRECTORY Change the working directory to DIRECTORY
.changes on|off Show number of rows changed by SQL
.check GLOB Fail if output since .testcase does not match
.clone NEWDB Clone data into NEWDB from the existing database
.databases # 列出数据库的名称及其所依附的文件
.dbconfig ?op? ?val? List or change sqlite3_db_config() options
.dbinfo ?DB? Show status information about the database
.dump ?TABLE? ... # 以 SQL 文本格式转储数据库。如果指定了 TABLE 表,则只转储匹配 LIKE 模式的 TABLE 表。
.echo on|off # 开启或关闭 echo 命令。
.import FILE TABLE # 导入来自 FILE 文件的数据到 TABLE 表中
.indices ?TABLE? # 显示所有索引的名称。如果指定了 TABLE 表,则只显示匹配 LIKE 模式的 TABLE 表的索引。
.log FILE\|off # 开启或关闭日志。FILE 文件可以是 stderr(标准错误)/stdout(标准输出)。
.mode MODE ?TABLE? # 设置输出模式,可选泽的模式:csv 、column 、html、insert、line 、list、list 、tabs 、tcl
.open ?OPTIONS? ?FILE? # 关闭现有的数据库并重新打开文件
.output FILE name # 发送输出到 FILE name 文件。
.output stdout # 发送输出到屏幕。
.print STRING... # 逐字地输出 STRING 字符串。
.quit # 退出 SQLite 提示符终端。
.read FILE name # 从FILE读取输入
.schema ?PATTERN? # 显示与PATTERN匹配的CREATE语句
.show # 显示各种设置的当前值
.stats ON\|OFF # 开启或关闭统计。
.tables ?TABLE? # 列出与LIKE模式TABLE匹配的表的名称
···
首先我们创建一个数据库,SQLite 的 sqlite3 命令被用来创建新的
SQLite数据库,
我们不需要任何特殊的权限即可创建一个数据,如果路径下存在相同名字的数据库则直接打开该数据库而不是重新创建。
SQLite数据库的创建和导入导出
#创建数据库
$sqlite3 test.db
#将转换整个 test.db 数据库的内容到 SQLite 的语句中,并将其转储到 ASCII 文本文件 test.sql 中
$sqlite3 test.db .dump > test.sql
#将test.sql 恢复到test.db
$sqlite3 test.db < test.sql
代码操作SQLite数据库
参考 https://www.runoob.com/sqlite/sqlite-c-cpp.html
# 若该数据库不存在则新建一个数据库
sqlite3_open(const char *filename, sqlite3 **ppDb)
# 执行SQL语句
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
# 关闭之前打开的数据库
sqlite3_close(sqlite3*)
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
typedef int (*sqlite3_callback)(
void*, /* Data provided in the 4th argument of sqlite3_exec() */
int, /* The number of columns in row */
char**, /* An array of strings representing fields in the row */
char** /* An array of strings representing column names */
);
static int callback(void *data, int argc, char **argv, char **azColName)
//static int callback(int argc, char **argv, char **azColName)
{
int i;
//fprintf(stderr, "%s: ", (const char*)data);
static int key=1;
if(key)
{
for(i=0; i<argc; i++){
printf("%s\t", azColName[i]);
}
printf("\n");
key=0;
}
for(i=0; i<argc; i++){
printf("%s\t", argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
//打开数据库,当数据库不存在时新建数据库
sqlite3* open_db()
{
sqlite3 *db;
char *ErrorMsg = NULL;
int rce;
rce = sqlite3_open("./database/test.db", &db);//数据库路径
if( rce ){
printf("连接数据库失败: %s\n", sqlite3_errmsg(db));
}
else{
printf("数据库连接成功\n");
}
return db;
}
//关闭数据库
int close_db(sqlite3 *db)
{
sqlite3_close(db);
return 0;
}
//执行sql语句
int execute_sql(sqlite3 *db, char *sql)
{
char *ErrorMsg = NULL;
int rce;
/* Execute SQL statement */
rce = sqlite3_exec(db, sql, callback, NULL, &ErrorMsg);
if( rce != SQLITE_OK ){
printf("SQL语句执行错误: %s\n", ErrorMsg);
sqlite3_free(ErrorMsg);
return 0;
}
else{
printf("SQL语句执行成功\n");
}
return -1;
}
int main(int argc, char* argv[])
{
sqlite3 *db;
char *sql_creat_table;
char *sql_insert;
char *sql_select;
char *sql_update;
char *sql_delete;
int rce;
db=open_db();
//创建表
sql_creat_table = "CREATE TABLE Student(" \
"ID INT PRIMARY KEY NOT NULL," \
"NAME TEXT NOT NULL," \
"AGE INT NOT NULL," \
"ADDRESS CHAR(50)," \
"SALARY REAL );";
sql_insert = "INSERT INTO Student (ID,NAME,AGE,ADDRESS,SALARY) " \
"VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \
"INSERT INTO Student (ID,NAME,AGE,ADDRESS,SALARY) " \
"VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " \
"INSERT INTO Student (ID,NAME,AGE,ADDRESS,SALARY)" \
"VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \
"INSERT INTO Student (ID,NAME,AGE,ADDRESS,SALARY)" \
"VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );";
sql_select= "SELECT * from Student";
sql_update = "UPDATE Student set SALARY = 25000.00 where ID=1; " \
"SELECT * from Student";
sql_delete= "DELETE from Student where ID=2; " \
"SELECT * from Student";
rce=execute_sql(db, sql_creat_table);
if(rce)
printf("创建表成功\n");
else
printf("创建表失败\n");
rce=execute_sql(db, sql_insert);
if(rce)
printf("插入数据成功\n");
else
printf("插入数据失败\n");
rce=execute_sql(db, sql_select);
if(rce)
printf("查询数据成功\n");
else
printf("查询数据失败\n");
rce=execute_sql(db, sql_update);
if(rce)
printf("更新数据成功\n");
else
printf("更新数据失败\n");
rce=execute_sql(db, sql_delete);
if(rce)
printf("删除数据成功\n");
else
printf("删除数据失败\n");
close_db(db);
return 0;
}
相关错误以及解决办法
引用sqlite3.h报错
fatal error: sqlite3.h: 没有那个文件或目录
sudo apt-get install libsqlite3-dev
对’sqlite3_open’未定义的引用
gcc test.c -lsqlite3
原文链接
https://taotaodiy-linux.readthedocs.io/en/latest/sql/sqlite.html