SQLite数据库使用(sqlite3 c++)

本文只针对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
    //判断表是否存在
    /* 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, 0, &zErrMsg);
    if( rc != SQLITE_OK ){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
       sqlite3_free(zErrMsg);
    }else{
       fprintf(stdout, "Table created successfully\n");
    }
    //&#x82E5;&#x5B58;&#x5728;&#x5219;&#x5220;&#x9664;&#x8868;
    /* drop SQL statement */
    char *sql_d = "DROP TABLE IF EXISTS COMPANY;";   //&#x5220;&#x9664;&#x8868;&#x4E0D;&#x505A;&#x5224;&#x65AD; "DROP TABLE COMPANY("

    /* Execute SQL statement */
     char *zErrMsg = 0;
    int rc = sqlite3_exec(db, sql_d, NULL, 0, &zErrMsg);
    if( rc != SQLITE_OK ){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
       sqlite3_free(zErrMsg);
    }else{
       fprintf(stdout, "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,&db);
    if(res)
    {
        fprintf(stderr, "Can't open database: %s\n", 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   :  "<

写入数据方式二:

&#x7B2C;&#x4E8C;&#x79CD;&#x5199;&#x5165;&#x6570;&#x636E;&#x7684;&#x65B9;&#x5F0F;------------------------------------------
    sqlite3_exec(db,"begin;",0,0,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,TIME_START,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,2,local_ip.c_str(),-1,SQLITE_STATIC);
        sqlite3_bind_text(stmt,3,local_ip.c_str(),-1,SQLITE_STATIC);
        ret = sqlite3_step(stmt);
//        if(rc != SQLITE_DONE)
//        {
//            fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
//            sqlite3_close(db);
//        }
        sqlite3_reset(stmt);
        sqlite3_finalize(stmt);
    }
    else
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
    }
    sqlite3_exec(db,"commit;",0,0,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:(用处:获取当前数据库的所写的行数)

    //&#x83B7;&#x53D6;&#x5F53;&#x524D;&#x6570;&#x636E;&#x5E93;&#x6700;&#x5927;ID&#x503C;
    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)
    {
        //&#x67E5;&#x8BE2;&#x6210;&#x529F;
        ID = nrow;
        qDebug() << "nrow :" <<  nrow;
    }
    else{
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        qDebug() << "SELECT error :" ;
    }
    //&#x91CA;&#x653E; dbresult &#x7684;&#x67E5;&#x8BE2;&#x7ED3;&#x679C;
    sqlite3_free_table(dbresult);

3、Ubuntu和nano安装sqlite3

3.1、Ubuntu安装sqlite3

sudo apt-get install sqlite3
//&#x67E5;&#x770B;&#x7248;&#x672C;&#x4FE1;&#x606F;
sqlite3 -version

3.2、nano安装sqlite3

使用apt在Nano上安装,但是找不到sqlite3.h,所以只能使用源码编译。

下载源码:SQLite Download Page

SQLite数据库使用(sqlite3 c++)
//&#x89E3;&#x538B;
tar xvzf sqlite-autoconf-3310100.tar.gz
//&#x8FDB;&#x5165;sqlite&#x6587;&#x4EF6;&#x5939;
cd sqlite-autoconf-3310100
//&#x914D;&#x7F6E;&#x6587;&#x4EF6;
./configure
//&#x5F00;&#x59CB;&#x7F16;&#x8BD1;
make
//&#x5199;&#x5165;&#x7CFB;&#x7EDF;&#x6587;&#x4EF6;&#x4E2D;
sudo make install
//&#x67E5;&#x770B;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;
dpkg -L sqlite3

Original: https://blog.csdn.net/PC1022/article/details/123812056
Author: PC1022
Title: SQLite数据库使用(sqlite3 c++)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/815128/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球