当前位置:首页 > 代码 > 正文

sqlite3源代码的简单介绍

admin 发布:2022-12-19 22:29 140


今天给各位分享sqlite3源代码的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何使用SQLite,Android上SQLite的最佳实践

SQLite3是目前最新的SQLite版本。可以从网站上下载SQLite3的源代码(本书使用的版本是sqlite-3.6.12.tar.gz)。

解压缩后进入sqlite-3.6.12的根目录,首先命令“./configure”生成Makefile文件,接着运行命令“make”对源代码进行编译,最后运行命令“make install”安装SQLite3。安装完毕后,可以运行命令sqlite3查看SQLite3是否能正常运行,如下所示:

[root@localhost ~]# sqlite3

SQLite version 3.6.12

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite

可以看到,SQLite3启动后会停留在提示符sqlite处,等待用户输入SQL语句。

在使用SQLite3前需要先了解下SQLite3支持的数据类型。SQLite3支持的基本数据类型主要有以下几类:

NULL

NUMERIC

INTEGER

REAL

TEXT

SQLite3会自动把其他数据类型转换成以上5类基本数据类型,转换规则如下所示:

char、clob、test、varchar— TEXT

integer—INTEGER

real、double、float— REAL

blob—NULL

其余数据类型都转变成NUMERIC

下面通过一个实例来演示SQLite3的使用方法。

新建一个数据库

新建数据库test.db(使用.db后缀是为了标识数据库文件)。在test.db中新建一个表test_table,该表具有name,、sex、age三列。SQLite3的具体操作如下所示:

[root@localhost home]# sqlite3 test.db

SQLite version 3.6.12

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite create table test_table(name, sex, age);

如果数据库test.db已经存在,则命令“sqlite3 test.db”会在当前目录下打开test.db。如果数据库test.db不存在,则命令“sqlite3 test.db”会在当前目录下新建数据库test.db。为了提高效率,SQLite3并不会马上创建test.db,而是等到第一个表创建完成后才会在物理上创建数据库。

由于SQLite3能根据插入数据的实际类型动态改变列的类型,所以在create语句中并不要求给出列的类型。

创建索引

为了加快表的查询速度,往往在主键上添加索引。如下所示的是在name列上添加索引的过程。

sqlite create index test_index on test_table(name);

操作数据

如下所示的是在test_table中进行数据的插入、更新、删除操作:

sqlite insert into test_table values ('xiaoming', 'male', 20);

sqlite insert into test_table values ('xiaohong', 'female', 18);

sqlite select * from test_table;

xiaoming|male|20

xiaohong|female|18

sqlite update test_table set age=19 where name = 'xiaohong';

sqlite select * from test_table;

xiaoming|male|20

xiaohong|female|19

sqlite delete from test_table where name = 'xiaoming';

sqlite select * from test_table;

xiaohong|female|19

批量操作数据库

如下所示的是在test_table中连续插入两条记录:

sqlite begin;

sqlite insert into test_table values ('xiaoxue', 'female', 18);

sqlite insert into test_table values ('xiaoliu', 'male', 20);

sqlite commit;

sqlite select * from test_table;

xiaohong|female|19

xiaoxue|male|18

xiaoliu|male|20

运行命令commit后,才会把插入的数据写入数据库中。

数据库的导入导出

如下所示的是把test.db导出到sql文件中:

[root@localhost home]# sqlite3 test.db ".dump" test.sql;

test.sql文件的内容如下所示:

BEGIN TRANSACTION;

CREATE TABLE test_table(name, sex, age);

INSERT INTO "test_table" VALUES('xiaohong','female',19);

CREATE INDEX test_index on test_table(name);

COMMIT;

如下所示的是导入test.sql文件(导入前删除原有的test.db):

[root@localhost home]# sqlite3 test.db test.sql;

通过对test.sql文件的导入导出,可以实现数据库文件的备份。

11.2.2 SQLite3的C接口

以上介绍的是SQLite3数据库的命令操作方式。在实际使用中,一般都是应用程序需要对数据库进行访问。为此,SQLite3提供了各种编程语言的使用接口(本书介绍C语言接口)。SQLite3具有几十个C接口,下面介绍一些常用的C接口。

sqlite_open

作用:打开SQLite3数据库

原型:int sqlite3_open(const char *dbname, sqlite3 **db)

参数:

dbname:数据库的名称;

db:数据库的句柄;

sqlite_colse

作用:关闭SQLite3数据库

原型:int sqlite_close(sqlite3 *db)

例如:

test.c:

#include stdio.h

#include sqlite3.h

static sqlite3 *db=NULL;

int main()

{

int rc;

rc= sqlite3_open("test.db", db);

if(rc)

{

printf("can't open database!\n");

}

else

{

printf("open database success!\n");

}

sqlite3_close(db);

return 0;

}

运行命令“gcc –o test test.c –lsqlite3”进行编译,运行test的结果如下所示:

[root@localhost home]# open database success!

sqlite_exec

作用:执行SQL语句

原型:int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg)

参数:

db:数据库;

sql:SQL语句;

callback:回滚;

errmsg:错误信息

例如:

test.c:

#include stdio.h

#include sqlite3.h

static sqlite3 *db=NULL;

static char *errmsg=NULL;

int main()

{

int rc;

rc = sqlite3_open("test.db", db);

rc = sqlite3_exec(db,"insert into test_table values('daobao', 'male', 24)", 0, 0, errmsg);

if(rc)

{

printf("exec fail!\n");

}

else

{

printf("exec success!\n");

}

sqlite3_close(db);

return 0;

}

编译完成后,运行test的结果如下所示:

[root@localhost home]# ./test

exec success!

[root@localhost home]# sqlite3 test.db

SQLite version 3.6.11

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite select * from test_table;

daobao|male|24

sqlite3_get_table

作用:执行SQL查询

原型:int sqlite3_get_table(sqlite3 *db, const char *zSql, char ***pazResult, int *pnRow, int *pnColumn, char **pzErrmsg)

参数:

db:数据库;

zSql:SQL语句;

pazResult:查询结果集;

pnRow:结果集的行数;

pnColumn:结果集的列数;

errmsg:错误信息;

sqlite3_free_table

作用:注销结果集

原型:void sqlite3_free_table(char **result)

参数:

result:结果集;

例如:

test.c:

#include stdio.h

#include sqlite3.h

static sqlite3 *db=NULL;

static char **Result=NULL;

static char *errmsg=NULL;

int main()

{

int rc, i, j;

int nrow;

int ncolumn;

rc= sqlite3_open("test.db", db);

rc= sqlite3_get_table(db, "select * from test_table", Result, nrow, ncolumn,

errmsg);

if(rc)

{

printf("query fail!\n");

}

else

{

printf("query success!\n");

for(i = 1; i = nrow; i++)

{

for(j = 0; j ncolumn; j++)

{

printf("%s | ", Result[i * ncolumn + j]);

}

printf("\n");

}

}

sqlite3_free_table(Result);

sqlite3_close(db);

return 0;

}

编译完成后,运行test的结果如下所示:

[root@localhost home]# ./test

query success!

xiaohong | female | 19 |

xiaoxue | female | 18 |

xiaoliu | male | 20 |

daobao | male | 24 |

sqlite3_prepare

作用:把SQL语句编译成字节码,由后面的执行函数去执行

原型:int sqlite3_prepare(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **stmt, const char **pTail)

参数:

db:数据库;

zSql:SQL语句;

nByte:SQL语句的最大字节数;

stmt:Statement句柄;

pTail:SQL语句无用部分的指针;

sqlite3_step

作用:步步执行SQL语句字节码

原型:int sqlite3_step (sqlite3_stmt *)

例如:

test.c:

#include stdio.h

#include sqlite3.h

static sqlite3 *db=NULL;

static sqlite3_stmt *stmt=NULL;

int main()

{

int rc, i, j;

int ncolumn;

rc= sqlite3_open("test.db", db);

rc=sqlite3_prepare(db,"select * from test_table",-1,stmt,0);

if(rc)

{

printf("query fail!\n");

}

else

{

printf("query success!\n");

rc=sqlite3_step(stmt);

ncolumn=sqlite3_column_count(stmt);

while(rc==SQLITE_ROW)

{

for(i=0; i2; i++)

{

printf("%s | ", sqlite3_column_text(stmt,i));

}

printf("\n");

rc=sqlite3_step(stmt);

}

}

sqlite3_finalize(stmt);

sqlite3_close(db);

return 0;

}

编译完成后,运行test的结果如下所示:

[root@localhost home]# ./test

query success!

xiaohong | female | 19 |

xiaoxue | female | 18 |

xiaoliu | male | 20 |

daobao | male | 24 |

在程序中访问SQLite3数据库时,要注意C API的接口定义和数据类型是否正确,否则会得到错误的访问结果。

如何编译SQLite-How To Compile SQLite

SQLite是ANSI-C的源代码。在使用之前必须要编译成机器码。这篇文章是用于各种编译SQLite方法的指南。

这篇文章不包含编译SQLite的每个步骤的反馈,那样可能会困难因为每种开发场景都不同。所以这篇文章描述和阐述了编译Sqlite的原则。典型的编译命令已经作为例子提供了,以期望应用开发者能够使用这些例子作为完成他们自己定制的编译过程的的一个指南。换句话说,这篇文章提供了想法和见解,而不是交钥匙的解决方法。

融合VS单独源文件

Sqlite是由超过一百个c源码文件以及众多的目录下的脚本构建的。Sqlite的实现是纯粹的ANSI-C,但是许多C语言源代码文件是由辅助的C程序生成或者转换来的,并且AWK,SED和TCL脚本会融合到完成的sqlite库中。对Sqlite构建需要的C程序和转换和创建C语言源码是一个复杂的过程。

为了简化这些,sqlite也通过一个预打包的合并后的源码文件:sqlite3.c。这个合并文件是一个ANSI-C源码实现整个SQLite库的唯一文件。合并后的文件更容易处理。所有的东西都包含在这一个文件里,所以很容易进入一个更大的C或者C++程序的源码树。所有的代码生成和转换步骤都已经实现了,因此没有辅助的C程序需要去配置和变异,也没有脚本需要去运行。并且,因此所有哭都包含在一个翻译单元,编译器可以做更多高级的优化从而提升5%到10%的性能。因为这些原因,融合后的源码文件sqlite3.c对所有程序来讲都是值得推荐的。

推荐所有的应用程序使用融合文件。

直接从单独的源码文件中构建sqlite当然可以,但是并不推荐。对一些特殊的应用程序,可能需要修改构建程序去处理使用那些从网站上下载的预构建的源码文件不能完成的情况。对于这些情况,推荐构建和使用一个定制过的合并文件。换句话说,即使一个工程需要以单独的源码文件构建sqlite,仍然推荐使用一个融合后的源码文件作为一个中间步骤。

编译命令行接口(CLI)

构建命令行接口需要三个源码文件:

sqlite3.c:Sqlite融合的源码文件

sqlite3.h:匹配sqlite3.c以及定义sqlite的c语言接口的头文件

shell.c:命令行接口程序本身。这个c源码文件包含一个main()的例程和每轮循环的用户输入的提示符并将输入传给sqlite数据库引擎用于处理。

所有的上述源码的三个文件都被包含在下载页面的amalgamation tarball中。

为了构建CLI,简单的将这三个文件放置在相同的目录下然后一起编译他们。用MSVC:

cl shell.c sqlite3.c -Fesqlite3.exe

在unix系统上(或者在windows上用cygwin或者mingw+msys)典型的命令会有些像这样:

gcc shell.c sqlite3.c -lpthread -ldl

为了SQLite线程安全,需要pthreads库。但是因为CLI是一个单线程的,我们可以指示SQLite构建一个非线程安全的库并因此护绿pthreads库:

gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl

-ldl库是在支持动态装载时需要,例如sqlite3_load_extension() 接口和load_extension()

SQL function。如果这些特性都不要求,那么我们也可以使用SQLITE_OMIT_LOAD_EXTENSION编译时间选项忽略他们。

gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c

有人可能想要提供其他的编译时间选项(compile-time options),例如SQLITE_ENABLE_FTS3去全文本搜索或者SQLITE_ENABLE_RTREE用于R*树搜索引擎扩展。而有人将正常指定一些编译优化开关。(预编译的CLI可以从选择sqlite网站上使用“-Os”下载下来)有无数种可能的变数在这里。

关键点在这里:构建CLI需要编译一起两个C语言文件。shell.c文件包含入口的定义和用户输入的loop,而sqlite融合文件sqlite3.c包含完整的sqlite库的实现。

编译TCL接口

sqlite的tcl接口是一个小的模块被添加到一般的融合文件中。结果是一个新的融合后的源码文件,称之为“tclsqlite3.c”。这个源码文件是生成一个可以使用TCL

load命令去加载到一个标准的tclsh或者wish中,或者随着sqlite构建成功生成一个单独唯一的tclsh的共享库所需要的。一个tcl的融合的副本被包含在下载页的TEA

tarball中作为一个文件。

为了生成一个linux上的sqlite的TCL-loadable库,下面的命令需要满足:

gcc -o libtclsqlite3.so -shared tclsqlite3.c -lpthread -ldl -ltcl

不幸的是构建Mac OS X 和 Windows的共享库并不是如此简单。对于这些平台最好使用包含在TEA tarball中的configure脚本和makefile.

为了生成一个单独的tclsh,可以用于sqlite静态链接,使用如下的编译器调用:

gcc -DTCLSH=1 tclsqlite3.c -ltcl -lpthread -ldl -lz -lm

这里的技巧是-DTCLSH=1选项。sqlite的TCL接口模块包含一个main的过程,用于初始化一个TCL解释器并在以-DTCLSH=1编译后进入到一个命令行loop。上述命令可以工作在Linux和Mac

OS X,虽然有时可能需要依赖于平台调整库选项以及编译的TCL的哪一个版本。

构建融合文件

下载页提供的sqlite融合文件的版本对大多数用户来说是足够的。然而,一些工程可能想要或者需要构建他们自己的融合文件。一个常见的构建一个定制的融合文件的理由是为了使用特定的compile-time options来定制sqlite库。回想sqlite融合文件中包含了许多C代码由辅助程序和脚本生成。许多的编译时间选项影响这一成圣代码而且必须在融合文件组装前提供给代码生成器。这一系列必须传给代码生成器的编译时间相关的选项会使得sqlite的发布版本各不相同,但是在写这边文章的时候,代码生成器需要知道的这组选项包括:

SQLITE_ENABLE_UPDATE_DELETE_LIMIT

SQLITE_OMIT_ALTERTABLE

SQLITE_OMIT_ANALYZE

SQLITE_OMIT_ATTACH

SQLITE_OMIT_AUTOINCREMENT

SQLITE_OMIT_CAST

SQLITE_OMIT_COMPOUND_SELECT

SQLITE_OMIT_EXPLAIN

SQLITE_OMIT_FOREIGN_KEY

SQLITE_OMIT_PRAGMA

SQLITE_OMIT_REINDEX

SQLITE_OMIT_SUBQUERY

SQLITE_OMIT_TEMPDB

SQLITE_OMIT_TRIGGER

SQLITE_OMIT_VACUUM

SQLITE_OMIT_VIEW

SQLITE_OMIT_VIRTUALTABLE

为了构建一个定制的融合文件,先下载原始的独立源码文件到一个unix或者类unix开发平台。确定获取的原始源码文件不是“预编译过的源文件”。任何人都可以通过到下载页或者直接从configuration management system.获取完整的一套原始源码文件。

假设sqlite源码树被存在一个名为“sqlite”的目录下。计划构建一个平行目录下的名为“bld”的融合文件。首先通过运行sqlite源码树种的configure脚本运行或者通过制作一份源码树顶层的的makfile模板的一份,来构建一个合适的makefile.然后手动编辑这个Makfile去包含需要的编译时间相关的选项。最终运行:

make sqlite3.c

在windows上使用MSVC:

nmake /f Makefile.msc sqlite3.c

sqlite3.c的make

target会自动构造一般的“sqlite3.c”合并的源码文件,以及它的头文件“sqlite3.h”,和包含TCL接口的融合源码文件“tclsqlite3.c”。之后,需要的文件可以被拷贝到文件目录下然后根据上述勾勒的过程编译。

构建一个windows的动态链接库DLL

为了在windows构建一个sqlite的dll使用,首先获取对应的融合过的源码文件,sqlit3.c和sqlite.h。这些可以从SQLite website上下载或者和上述告知的一样去定制生成。

使用工作目录下的源码文件,一个dll可以在msvc中使用如下命令生成:

cl sqlite3.c -link -dll -out:sqlite3.dll

上述命令需要运行在msvc的MSVC Native Tools Command

Prompt.如何你已经在机器上安装了msvc,你可能有多个版本的这种命令提示符,针对于x86和x64的自带构建的,或者交叉编译到ARM的。依赖要求的DLL去使用对应合适的命令提示符工具。

如果使用MinGW编译器,命令是这样的:

gcc -shared sqlite3.c -o sqlite3.dll

注意MinGW只生成32位的dll。另有一个分开的MinGW64工程可以用来生成64位的dll。可以推断其命令行语法是类似的。需要注意的是最近的MSVC的版本生成的DLLs可能不能工作到WinXP或者更早版本的windows上。因此为了最大限度的兼容你的生成的dll,推荐MinGW。一个好的经验法则是使用MinGW去生成32位的dlls,使用msvc去生成64位的dlls。

怎样在Linux下从源代码安装SQLite 3

你不需要做任何的配置来使其工作。所有你需要的就是安装它并开始使用它。test -z "/usr/local/bin" || mkdir -p -- "/usr/local/bin" ./libtool --mode=install /usr/bin/install -c sqlite3 /usr/local/bin/sqlite3 /usr/bin/install -c .libs/sqlite3 /usr/local/bin/sqlite3 test -z "/usr/local/include" || mkdir -p -- "/usr/local/include" /usr/bin/install -c -m 644 'sqlite3.h' '/usr/local/include/sqlite3.h' /usr/bin/install -c -m 644 'sqlite3ext.h' '/usr/local/include/sqlite3ext.h' test -z "/usr/local/share/man/man1" || mkdir -p -- "/usr/local/share/man/man1" /usr/bin/install -c -m 644 './sqlite3.1' '/usr/local/share/man/man1/sqlite3.1' test -z "/usr/local/lib/pkgconfig" || mkdir -p -- "/usr/local/lib/pkgconfig" /usr/bin/install -c -m 644 'sqlite3.pc' '/usr/local/lib/pkgconfig/sqlite3.pc'提示:如果你对mysql数据库有兴趣,你也可以安装在你的系统中。原文:SQLite3 is an extremely lightweight SQL database engine that is self-contained and serverless.There is absolutely no configuration that you need to do to get it working. All you need to do is–install it, and start using it.Since this is serverless, it is used in lot of the famous software that you are using, and you probably didn’t even know those software were using it. View this list to see all the big name companies who are using SQLite. PHP programming language has SQLite database built in.If you’ve never used SQLite, follow the steps mentioned in this article to install it on Linux, and create a sample database.

怎样在Linux下从源代码安装SQLite3

说起来就4步,解压源码包--进入解压目录,根据需要定制配置,(./configure)--编译(make)--安装(make install),说起来简单,但是有时定制配置还是有点复杂和难度

sqlite3源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、sqlite3源代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/27709.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载