关系型数据库
ACID
- 原子性(atomicity,或称不可分割性):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性(consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- 隔离性(isolation,又称独立性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
- 事务隔离分为不同级别
- 读未提交(Read uncommitted)
- 读提交(read committed)
- 可重复读(repeatable read)
- 串行化(Serializable)。
- 持久性(durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
SQLlite
https://www.w3cschool.cn/sqlite
下载地址:https://www.sqlite.org/download.html : Precompiled Binaries for Windows
- 设计目标是嵌入式的,它占用资源非常的低。
- 能够支持主流的操作系统,同时能够跟很多程序语言相结合。
- 主要的通信协议是在编程语言内的直接API调用。
- 整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。
- 它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。
- 数据库文件可以在不同字节顺序的机器间自由的共享。
QT接口
https://blog.csdn.net/u011555996/article/details/108065572
.pro中加入SQL模块
QT += sql
头文件
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
建立数据库
- 检查连接
if (QSqlDatabase::contains(db_name)){
QSqlDatabase::database()
}
- 添加数据库驱动
- 设置数据库名称
QSqlDatabase::addDatabase("QSQLITE", db_name)
- 数据库登录用户名、密码。
打开数据库open(),并判断是否成功
database.open()
database.lastError()
操作
创建表
QSqlQuery sql_query;
QString create_sql = "create table <table_name> (f1 type1, f2 type2,…)";
sql_query.prepare(create_sql); \\ sql_query.exec()
插入
insert into <table_name> values (value1, value2,…);
更新数据(修改数据)
update <table_name> set <f1=value1>, <f2=value2>… where <expression>;
sql_query.bindValue(":name", "Qt"); // 把语句中的待定变量换成确定值
查询数据
select <f1>, <f2>, ... from <table_name>;
select * from <table_name>;
select max(id) from <table_name>; // 查询最大id
// sql_query.value(int) 获得数据, 返回值类型是QVariant,因此要用toInt()等函数转换成特定的类型。
while(sql_query.next())
{
int id = sql_query.value(0).toInt();
QString name = sql_query.value(1).toString();
}
删除数据
delete from <table_name> where <f1> = <value>
关闭close()
访问方式
QSqlQuery
QSqlQueryModel
QSqlTableModel
C\C++接口
sqlite3_open(const char *filename, sqlite3 **ppDb)
- 如果 filename 参数是 NULL 或 ‘:memory:’,那么 sqlite3_open() 将会在 RAM 中创建一个内存数据库,这只会在 session 的有效时间内持续。
- 如果文件名 filename 不为 NULL,那么 sqlite3_open() 将使用这个参数值尝试打开数据库文件。如果该名称的文件不存在,sqlite3_open() 将创建一个新的命名为该名称的数据库文件并打开。
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
sqlite3_close(sqlite3*)