本文只针对sqlite3 c++ API调用。
1、基础知识
sqlite3只是一个嵌入式数据库引擎,占用资源非常底,可以适用于Windows和Linux,而且sqlite3只是一个文件,不需要服务器进程。
sqlite3 c++ api接口只需要引用sqlite3.h头文件就行。
常用术语:表(table)、字段(column,列,属性)、记录(row,record)。
存储类型:integer(整型)、real(浮点型)、text(文本字符串)、blob(二进制数据)。
关键字:select、insert、update、delete、from、creat、where、desc、order、by、group、table、alter、view、index等,数据库中不能使用关键字命名表和字段。
2、数据库语句
2.1、创建或打开数据库
对应c++代码
//不存在即创建数据库
sqlite3* db;
int res = sqlite3_open(sql_name,&db);
if(res)
{
fprintf(stderr,"Can't open database: %s\n",sqlite3_errmsg(db));
qDebug() << "database failed to open ";
}
else{
qDebug() << "database open sucess";
}
2.2、数据定义语句
- 新建表 ⟹ create:create table 表名 (字段名1 字段类型1,字段名2 字段类型2,。。。); create table if not exists 表名 (字段名1 字段类型1,字段名2 字段类型2,。。。);
CREATE TABLE IF NOT EXISTS t_person (id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);
- 删除表 ⟹ drop:dorp table 表名;drop table if exists 表名;
DROP TABLE IF EXISTS t_person;
对应c++代码:
//回调函数
static int callback(void *NotUsed,int argc,char **argv,char **azColName){
int i;
for(i=0; i<argc; i++){
printf("%s = %s\n",azColName[i],argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
//判断表是否存在
/* Create SQL statement */
char *sql = "CREATE TABLE IF NOT EXISTS COMPANY(" \ //只是创建表 "CREATE TABLE COMPANY("
"ID INT PRIMARY KEY NOT NULL," \
"TIME_START TEXT NOT NULL," \
"TIME_END TEXT NOT NULL," \
"DETECT_IP TEXT NOT NULL," \
"CONTAINER_NUM TEXT NOT NULL," \
"REAL_RESULTS TEXT NOT NULL," \
"DETECT_RESULTS TEXT NOT NULL," \
"DETECT_TIME TEXT NOT NULL," \
"NOTE TEXT NOT NULL);";
/* Execute SQL statement */
char *zErrMsg = 0;
int rc = sqlite3_exec(db,sql,callback,&zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr,"SQL error: %s\n",zErrMsg);
sqlite3_free(zErrMsg);
}else{
fprintf(stdout,"Table created successfully\n");
}
//若存在则删除表
/* drop SQL statement */
char *sql_d = "DROP TABLE IF EXISTS COMPANY;"; //删除表不做判断 "DROP TABLE COMPANY("
/* Execute SQL statement */
char *zErrMsg = 0;
int rc = sqlite3_exec(db,sql_d,NULL,"Table drop successfully\n");
}
2.3、数据操作语句
- 添加表中的数据 ⟹ insert:insert into 表名 (字段1,字段2,。。。) values (字段1的值,字段2的值);字符串内容用单引号。
INSERT INTO t_person (name,age) VALUES ('大明', 22);
- 修改表中的数据 ⟹ update:update 表名 set 字段1 = 字段1的值,字段2 = 字段2的值,。。。;
UPDATE t_person SET name = '小明',age = 10; // 把表中name字段的值全部改成小明,age字段的值全部改成10。
UPDATE t_person SET age = 12 WHERE name = '小明'; // 把表中name字段值是小明的age值改为12。
- 删除表中的数据 ⟹ delete:delete from 表名;delete from 表名 where 字段 = 字段值。
DELETE FROM t_person; // 删除表中的所有记录。
DELETE FROM t_person WHERE age = 25; // 删除表中字段age等于25的这条记录。
DELETE FROM t_person WHERE age > 12 AND age < 15; // 删除表中年龄大于12且小于15的记录。
写入数据方式一:
sqlite3* db;
int res = sqlite3_open(sql_name,sqlite3_errmsg(db));
qDebug() << "database failed to open ";
}
else{
qDebug() << "database2 open sucess";
}
/* INSERT SQL statement */
ID += 1;
time_start =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong();
time.start();
char *zErrMsg = 0;
std::string local_ip = "'192.168.53.21'";
int64_t time_end =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong();
std::string container_num = "'#^XH^123456^42G1^'";
QString isEmptoy = "'空箱'";
//char detect_results = 0x00;
std::string detect_results_sql;
std::string note = "''" ;
qDebug()<< "detect_results : "<<detect_results;
detect_results_sql = "'未执行检测'";
note = "'设备防夹保护触发,设备停止运动'";
int timeElapsed = time.elapsed();
qDebug()<< "timeElapsed : "<<timeElapsed<<" ms";
//float detect_time = float(time_end -time_start)/1000;
float detect_time = float(timeElapsed)/1000;
std::string sql_add = "INSERT INTO COMPANY (ID,TIME_START,TIME_END,DETECT_IP,CONTAINER_NUM,REAL_RESULTS,DETECT_RESULTS,DETECT_TIME,NOTE) "
"VALUES(" + std::to_string(ID)+","+ std::to_string(time_start)+","+ std::to_string(time_end)+","+local_ip+","
""+container_num+","+isEmptoy.toStdString()+","+detect_results_sql+","+std::to_string(detect_time)+","+note+"); " ;
/* Execute SQL statement */
int rc = sqlite3_exec(db,sql_add.c_str(),&zErrMsg);
if( rc != SQLITE_OK ){
fprintf(stderr,"INSERT2 created successfully\n");
}
sqlite3_close(db);
}
写入数据方式二:
第二种写入数据的方式------------------------------------------
sqlite3_exec(db,"begin;",0);
int64_t time_start =QDateTime::currentDateTime().toString("yyyyMMddhhmmsszzz").toLongLong();
std::string local_ip = "192.168.53.21";
sqlite3_stmt *stmt;
const char* sql_insert = "INSERT INTO COMPANY (ID,DETECT_IP) VALUES(?,?,? );" ;
int ret = sqlite3_prepare_v2(db,sql_insert,-1,&stmt,0);
if(ret == SQLITE_OK)
{
sqlite3_bind_int(stmt,1,1);
sqlite3_bind_int64(stmt,2,time_start);
//sqlite3_bind_text(stmt,local_ip.c_str(),SQLITE_STATIC);
sqlite3_bind_text(stmt,3,SQLITE_STATIC);
ret = sqlite3_step(stmt);
// if(rc != SQLITE_DONE)
// {
// fprintf(stderr,sqlite3_errmsg(db));
// sqlite3_close(db);
// }
sqlite3_reset(stmt);
sqlite3_finalize(stmt);
}
else
{
fprintf(stderr,zErrMsg);
}
sqlite3_exec(db,"commit;",0);
sqlite3_free(zErrMsg);
2.3查询数据
- select:select 字段1, 字段2, 。。。 from 表名;select 字段1, 字段2, 。。。 from 表名 where 字段 = 某值;select * from 表名;(查询所有的字段)
- 表别名:select 字段1 别名, 字段2 别名,。。。from 表名 别名;select 字段1 别名, 字段2 as 别名,。。。from 表名 as 别名;select 别名.字段1,别名.字段2,。。。from 表名 别名;
SELECT name,age FROM t_person WHERE age < 80;
SELECT * FROM t_person WHERE age < 80;
SELECT name,age nianling FROM t_person ren WHERE ren.age > 80 AND nianling < 90;
- 计算记录条数:select count(字段或者*) from 表名;
SELECT count(name) FROM t_person ren WHERE ren.age > 80;
SELECT count(*) FROM t_person ren WHERE ren.age > 80;
- where:where 字段 = 某值;where 字段 is 某值;where 字段 != 某值;where 字段 is not 某值;where 字段 > 某值;where 字段1 = 某值1 and 字段2 < 某值2;where 字段1 = 某值1 or 字段2 > 某值2;
- order by:select * from 表名 order by 字段(默认升序);select * from 表名 order by 字段 desc(降序);select * from 表名 order by 字段 asc(升序);select * from 表名 order by 字段1 asc(先按字段1升序),字段2 desc(再按字段2降序);
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC,name ASC; // 先按年龄降序,再按名字升序。
- limit:select * from 表名 limit 数值1,数值2;分页查询,数值1表示跳过前面多少条,数值2表示取出之后多少条。select * from 表名 limit 数值2;(跳过前面0条,相当于select * from 表名 limit 0,数值2,表示最前面多少条数据)
SELECT * FROM t_person WHERE age < 100 ORDER BY age DESC,name ASC LIMIT 3, 5; // 先筛选,后排序,再分页。
- like:模糊查询,select 字段1, 字段2, 。。。 from 表名 where 字段 like %某值%;
SELECT * FROM t_person WHERE name like '%明%';
查询ID:(用处:获取当前数据库的所写的行数)
//获取当前数据库最大ID值
char **dbresult;
int nrow,ncolumn;
char *sql_select = "SELECT * from COMPANY";
res = sqlite3_get_table(db,sql_select,&dbresult,&nrow,&ncolumn,&zErrMsg);
if(res == SQLITE_OK)
{
//查询成功
ID = nrow;
qDebug() << "nrow :" << nrow;
}
else{
fprintf(stderr,zErrMsg);
qDebug() << "SELECT error :" ;
}
//释放 dbresult 的查询结果
sqlite3_free_table(dbresult);
3、Ubuntu和nano安装sqlite3
3.1、Ubuntu安装sqlite3
sudo apt-get install sqlite3
//查看版本信息
sqlite3 -version
3.2、nano安装sqlite3
使用apt在Nano上安装,但是找不到sqlite3.h,所以只能使用源码编译。
下载源码:SQLite Download Page
//解压
tar xvzf sqlite-autoconf-3310100.tar.gz
//进入sqlite文件夹
cd sqlite-autoconf-3310100
//配置文件
./configure
//开始编译
make
//写入系统文件中
sudo make install
//查看文件路径
dpkg -L sqlite3
原文地址:https://blog.csdn.net/PC1022
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。