sqlite3 编译安装及快速入门 [2013-11-30更新]

时间:2022-08-12 05:33:38
- 移植安装
1. 下载源码包sqlite官网 http://www.sqlite.org/下载:http://www.sqlite.org/sqlite-autoconf-3070500.tar.gz
2. 解压
# tar -zxvf sqlite-autoconf-3070500.tar.gz

3. 配置
# cd sqlite-autoconf-3070500
# ./configure --host=arm-linux --prefix=/root/build_sqlite
(如果想生成x86可执行的版本,省去"--host=..."即可,其他步骤不变)

-------------------------------------------------------------

- 使能内存管理功能(即 int sqlite3_release_memory(int); 方法)

打开Makefile文件,在 DEFS = ... 后面添加编译选项:-DSQLITE_ENABLE_MEMORY_MANAGEMENT
SQLite总是倾向于将数据缓存在内存中,以此减少IO操作的次数,对于传入SQLite API的指针变量,使用完后必须手动释放内存。

释放内存:sqlite3_free(msg);
sqlite3_free_table(dataSet);

-------------------------------------------------------------
4. make & make install
成功后将在 /root/build_sqlite 目录下生成4个目录(bin、include、lib、share)

5. 下载 
将 bin 下的文件下载到开发板的 /usr/bin 目录中
将 lib 下的所有文件下载到开发板的 /usr/lib 目录中
include目录下是sqlite的C语言API的头文件,编程时会用到

6. 测试
[rootMrFeng]#sqlite3 test.db     (sqlite数据库一般以“db”作为扩展名,但不强制要求)
SQLite version 3.6.18
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table film (number,name);
sqlite> insert into film values (1,'aaa');
sqlite> insert into film values (2,'bbb');
sqlite> select * from film;
1|aaa
2|bbb
sqlite>.quit
[rootMrFeng]#

7. test_sqlite.c
sqlite3 编译安装及快速入门 [2013-11-30更新]
test_sqlite.c 为官网上的测试程序,通过main函数传参,直接编译可用,其中 callback 函数定义了查询结果的显示方式。
执行结果如下:
[root@localhost ~]# ./test_sqlite test.db "select * from film"
number = 1
name = aaa

number = 2
name = bbb



- 基本操作
1) 创建数据库文件
   >SQLite3 test.db
   生成test.db,同时sqlite挂上这个数据库

2) 帮助
   >.help

3) 可在命令行下直接输入SQL语句创建表,用“;”结束,回车就可看到结果

4) 查看所有表
   >.tables

5) 查看结构
   >.schema 表名
  
6) 查看目前挂的数据库
   >.database
  
7) 把查询输出到文件
   >.output filename
   >查询语句;

   把查询结果用屏幕输出
   >.output stdout

8) 把表结构输出,同时索引也会输出
   >.dump 表名

9) 退出
   >.exit 或者 .quit

10) 查看配置信息   >.show


- vacuum

当从SQLite删除数据后,未使用的磁盘空间被添加到一个内在的“空闲列表”
(“空闲列表”用于存储下次插入的数据)因此不向操作系统返回磁盘空间

以下2种方法可回收这部分磁盘空间:

1. 在创建数据库时将 auto-vacuum 设为1(默认为0)
    缺点:会产生碎片
    注意:auto-vacuum 的值只有在未建任何表的情况下才允许改变
          auto-vacuum 选项在 SQLite 3.1 后才出现

2. 执行“vacuum”命令
    缺点:比方法1耗时
    注意:官方说法是“在Linux的环境下,大约0.5秒/M”
    说明:
        命令行操作:
            sqlite3 *.db vacumm     // 不打开数据库
            vacuum;                 // 打开数据库
        程序操作:sql = "vacuum"     // 然后执行该语句



- 开发基础
1. SQLite不支持DataTime数据类型,可用TimeStamp类型替代。
2. 在SQLite命令行下执行 .header [on|off] 可显示或隐藏表头。
3. SQLite下的int类型支持 > 32bit 数值。
4. 自增字段:将主键设置为整型,插入数据时使用null替代。5. 时间函数:datetime()、date()、time()。
获取数据库中所有表/索引的信息
>select * from sqlite_master;
* 当文件(与扩展名无关)为空白时同样能执行上述语句,且返回相同结构的表,但记录数为0
* 可以用来判断某个文件是否是SQLite数据库文件



- 数据库打开操作

SQLite API 中有多个方法可打开数据库,包括:

SQLITE_API int sqlite3_open(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

SQLITE_API int sqlite3_open16(
  const void *filename,   /* Database filename (UTF-16) */
  sqlite3 **ppDb          /* OUT: SQLite db handle */
);

SQLITE_API int sqlite3_open_v2(
  const char *filename,   /* Database filename (UTF-8) */
  sqlite3 **ppDb,         /* OUT: SQLite db handle */
  int flags,              /* Flags */
  const char *zVfs        /* Name of VFS module to use */
);

------------------------------------------------------------------------
其中,sqlite3_open()、sqlite3_open16()方法当数据库文件不存在时依然返回true
因此,若需要判断数据库文件是否存在时应该选用sqlite3_open_v2()方法
------------------------------------------------------------------------
sqlite3_open_v2()中常用的flags包括:
SQLITE_OPEN_READONLY      // 只读,文件不存在时返回false
SQLITE_OPEN_READWRITE     // 读写,文件不存在时返回false
SQLITE_OPEN_CREATE        // 文件不存在时则创建

以下几种情况会导致sqlite3_open_v2()返回false:
1. 指定的文件不存在
2. 指定的文件为非SQLite数据库文件
3. 指定的文件被加密

* 注意:由于空白文件能成功打开,如需要判断数据库是否为空,则可参考下述方法:
------------------------------------------------------------------------QString sql = "select * from sqlite_master";
char **dataSet;
int nrow;
int ncolumn;
char *msg;
int ret;
    
std::string stdString = sql.toStdString();
const char *s = stdString.c_str();

// 若文件存在, 则判断数据库中是否存在表/索引等
ret = sqlite3_get_table(db, s, &dataSet, &nrow, &ncolumn, &msg);

if (ret != SQLITE_OK)
{
    qDebug() << "MSqlite3::open(): Database check error.";
    return false;
}

if (nrow != 0)
{
    qDebug() << "MSqlite3::open(): Database open success.";
    isOpen = true;
    return true;
}
else
{
    qDebug() << "MSqlite3::open(): Database is empty.";
    return false;
}
...------------------------------------------------------------------------


- 导入导出数据(CSV格式)
# sqlite3 -csv test.db "select * from data_table" > data.csv
# sqlite3 test.db ".import data.csv data_table"


- 图形界面管理工具

1. SQLite Database Browser
    http://sqlitebrowser.sourceforge.net/
    特点:多平台支持(Windows/Linux/Mac OS)

2. SQLite Administrator (推荐)
    http://sqliteadmin.orbmu2k.de/
    特点:小巧(2MB+)
    缺点:不支持中文路径

3. SQLite Expert - Personal Edition (推荐)
    http://www.sqliteexpert.com/ 
    特点:功能强大