SQLite在linux下的安装

前端之家收集整理的这篇文章主要介绍了SQLite在linux下的安装前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

下载 sqlite-3.3.6.tar.gz
@H_301_4@ 解压并拷贝至你想要安装到的目录下,我选择的是/usr/local/sqlite-3.3.6
@H_301_4@ 接着在终端里:
# cd /usr/local/sqlite-3.3.6
# ./configure
# make
# make install
# make doc

make@H_301_4@ 的时候提示错误
../sqlite-3.3.6/src/tclsqlite.c: In function `DbUpdateHandler':
../sqlite-3.3.6/src/tclsqlite.c:333: warning: passing arg 3 of `Tcl_ListObjAppendElement' makes pointer from integer without a cast
……
@H_301_4@ 这个都是tcl@H_301_4@ 相关的错误,@H_301_4@ 可以先安装ActiveTcl@H_301_4@ 以解决.@H_301_4@ 假如你不需要tcl@H_301_4@ 支持,@H_301_4@ 那么这个错误可以这样避免:
# ./configure --disable-tcl --prefix=/usr/local/sqlite-3.3.6
@H_301_4@
# make @H_301_4@ 如果提示没有可以编译的文件,则是第一次make@H_301_4@ 时已经执行过了,接着下面做就可以了;如果此次是第一次编译,应该不会再提示出错了
# make install
# make doc

@H_301_4@ 测试是否安装成功
# cd /usr/lcoal/sqlite-3.3.6
# ./sqlite3 text.db @H_301_4@ @H_301_4@ //@H_301_4@ @H_301_4@ 这也是进入数据库方法
@H_301_4@ @H_301_4@

@H_301_4@ 如果安装成功,会出现下面这样的信息
sqlite version 3.3.6
Enter ".help" for instructions
sqlite>
@H_301_4@ 接下来就可以自由操作啦,和在windows@H_301_4@ 下是一样的啦。@H_301_4@

@H_301_4@

二、@H_301_4@ sqlite@H_301_4@ @H_301_4@ 基本操作@H_301_4@

如以下操作:创建表、插入、查询:@H_301_4@

sqlite>createtabletbl1(onevarchar(10),twosmallint); @H_301_4@ @H_301_4@
@H_301_4@ sqlite>insertintotbl1values('hello!',10); @H_301_4@ @H_301_4@
@H_301_4@ sqlite>insertintotbl1values('goodbye',20); @H_301_4@ @H_301_4@
@H_301_4@ sqlite>select*fromtbl1; @H_301_4@ @H_301_4@
@H_301_4@ hello!|10@H_301_4@ @H_301_4@
@H_301_4@ goodbye|20@H_301_4@ @H_301_4@
@H_301_4@ sqlite>@H_301_4@ @H_301_4@

注意每句sql@H_301_4@ 语句后一定要有分号@H_301_4@ @H_301_4@ @H_301_4@ semicolon@H_301_4@ @H_301_4@ 。@H_301_4@ @H_301_4@ @H_301_4@

Special commands to sqlite3@H_301_4@ @H_301_4@ :@H_301_4@ @H_301_4@

sqlite>.help @H_301_4@ @H_301_4@

.databasesListnamesandfilesofattacheddatabases@H_301_4@ @H_301_4@
@H_301_4@ .exitExitthisprogram@H_301_4@ @H_301_4@

.outputFILENAMESendoutputtoFILENAME@H_301_4@ @H_301_4@
@H_301_4@ .outputstdoutSendoutputtothescreen@H_301_4@ @H_301_4@

.tables @H_301_4@ List the tables@H_301_4@ @H_301_4@

参考文件A command-line access program for sqlite databases//www.sqlite.org@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ @H_301_4@

三、C/C++@H_301_4@ 下sqlite@H_301_4@ 编程@H_301_4@ @H_301_4@

参考文件A introduction to the sqlite c/c++ interface@H_301_4@ @H_301_4@

找到安装sqlite@H_301_4@ 的路径:@H_301_4@

我们的@H_301_4@ sqlite3@H_301_4@ @H_301_4@ 的库文件目录是:@H_301_4@ /usr/local/sqlite3/lib @H_301_4@ //@H_301_4@ @H_301_4@ 我的机子安装目录文件名是@H_301_4@ @H_301_4@ sqlite-3.3.6
@H_301_4@ @H_301_4@ 可执行文件@H_301_4@ sqlite3 @H_301_4@ @H_301_4@ 的目录是:@H_301_4@ @H_301_4@ /usr/local/sqlite3/bin
@H_301_4@ @H_301_4@ 文件@H_301_4@ sqlite3.h @H_301_4@ @H_301_4@ 的目录是:@H_301_4@ /usr/local/sqlite3/include@H_301_4@ @H_301_4@ @H_301_4@

编译指南@H_301_4@ :@H_301_4@ 现在编译:@H_301_4@ [root@localhost dada]# gcc c3.c -o c3@H_301_4@ @H_301_4@ @H_301_4@

opendbsqlite.c:11:21: sqlite3.h: @H_301_4@ @H_301_4@ @H_301_4@ 没有那个文件或目录@H_301_4@ @H_301_4@
opendbsqlite.c: In function `main':
opendbsqlite.c:19: `sqlite3' undeclared (first use in this function) @H_301_4@ // @H_301_4@ @H_301_4@ @H_301_4@ 这是由于没有找到头文件的原因@H_301_4@ 。@H_301_4@ @H_301_4@

/tmp/ccTkItnN.o(.text+0x2b): In function `main':
: undefined reference to `sqlite3_open'
/tmp/ccTkItnN.o(.text+0x45): In function `main': @H_301_4@ @H_301_4@ @H_301_4@ // @H_301_4@ @H_301_4@ @H_301_4@ 这是个没有找到库文件的问题。@H_301_4@ @H_301_4@

可以在@H_301_4@ gcc@H_301_4@ @H_301_4@ 语句后面加上如下@H_301_4@ @H_301_4@

-lsqlite3@H_301_4@ @H_301_4@ -L/usr/local/sqlite3/lib@H_301_4@ @H_301_4@ -I/usr/local/sqlite3/include@H_301_4@ @H_301_4@ @H_301_4@

指明用到的库文件;为库文件指定路径;为头文件指定路径@H_301_4@ @H_301_4@ @H_301_4@ @H_301_4@

继续编译@H_301_4@ :@H_301_4@ @H_301_4@

出现@H_301_4@ "@H_301_4@ @H_301_4@ error while loading shared libraries@H_301_4@ " @H_301_4@ @H_301_4@ 错误@H_301_4@ @H_301_4@

我们可以这样解决:@H_301_4@ @H_301_4@
@H_301_4@ @H_301_4@ 方法一:静态编译@H_301_4@ @H_301_4@
@H_301_4@ @H_301_4@ 在编译时加上@H_301_4@ -static @H_301_4@ @H_301_4@ 参数,例如@H_301_4@ @H_301_4@

[root@localhost temp]# gcc c3.c -o c3 -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include –static@H_301_4@ @H_301_4@ @H_301_4@

静态编译后的文件相对动态编译更大,很容易理解,静态编译把头库文件作为程序的一部分都包含进来了。@H_301_4@ @H_301_4@

方法二:重新配置系统环境变量@H_301_4@ @H_301_4@ LD_LIBRARY_PATH
@H_301_4@ @H_301_4@ 这时需要指定@H_301_4@ libsqlite3.so.0 @H_301_4@ @H_301_4@ 文件的路径@H_301_4@ ,@H_301_4@ @H_301_4@ 也就是配置系统环境变量@H_301_4@ LD_LIBRARY_PATH @H_301_4@ @H_301_4@ ,@H_301_4@ @H_301_4@
@H_301_4@ @H_301_4@ 使系统能够找到@H_301_4@ libsqlite3.so.0 @H_301_4@ @H_301_4@ 。@H_301_4@ @H_301_4@ @H_301_4@ @H_301_4@

好了,现在我们来指定系统环境变量@H_301_4@ LD_LIBRARY_PATH @H_301_4@ @H_301_4@ 的值@H_301_4@ @H_301_4@
@H_301_4@ @H_301_4@ 在@H_301_4@ shell@H_301_4@ @H_301_4@ 下输入:@H_301_4@ @H_301_4@
[root@localhost temp]# @H_301_4@ export LD_LIBRARY_PATH=/usr/local/sqlite3/lib:$LD_LIBRARY_PATH @H_301_4@
@H_301_4@ @H_301_4@
@H_301_4@ 看看现在系统环境设置:@H_301_4@ @H_301_4@
[root@localhost temp]#env@H_301_4@ @H_301_4@ @H_301_4@

….@H_301_4@ @H_301_4@ @H_301_4@

LD_LIBRARY_PATH=/usr/local/sqlite3/lib:@H_301_4@ @H_301_4@ @H_301_4@

….. (@H_301_4@ @H_301_4@ 看到了吧,@H_301_4@ LD_LIBRARY_PATH@H_301_4@ @H_301_4@ 这一行开始就是@H_301_4@ sqlite3@H_301_4@ @H_301_4@ 的库文件路径:@H_301_4@ @H_301_4@ )
@H_301_4@ @H_301_4@ 去掉@H_301_4@ -static,@H_301_4@ @H_301_4@ 再编译:@H_301_4@ @H_301_4@
[root@localhost temp]# gcc c3.c -o c3 -lsqlite3 -L/usr/local/sqlite3/lib -I/usr/local/sqlite3/include@H_301_4@ @H_301_4@ @H_301_4@ @H_301_4@

我们推荐使用动态编译的方法。@H_301_4@ @H_301_4@
@H_301_4@ @H_301_4@ 至此编译就不会有什么问题了,另外一点:如果在程序中把#@H_301_4@ include <sqlite3.h>@H_301_4@ @H_301_4@ 写成#@H_301_4@ include<usr/local/sqlite-3.3.6/include/sqlite3.h>,@H_301_4@ @H_301_4@ 这样在编译的时候就不需要@H_301_4@ -I/usr/local/sqlite3/include@H_301_4@ @H_301_4@ 了。@H_301_4@ @H_301_4@

@H_301_4@ @H_301_4@

常用函数@H_301_4@

int sqlite3_open(@H_301_4@
@H_301_4@
 @H_301_4@ const char *filename, @H_301_4@ /* Database filename (UTF-8) */@H_301_4@ @H_301_4@
@H_301_4@
 @H_301_4@ sqlite3 **ppDb @H_301_4@ /* OUT: sqlite db handle */@H_301_4@ @H_301_4@
@H_301_4@
); @H_301_4@ @H_301_4@
@H_301_4@
int sqlite3_close(sqlite3 *);@H_301_4@
@H_301_4@
int sqlite3_exec(sqlite3*,const char *sql,sqlite3_callback,void *,char **errmsg );

@H_301_4@ 这就是执行一条@H_301_4@ @H_301_4@ sql @H_301_4@ 语句的函数。@H_301_4@ @H_301_4@

@H_301_4@ 第@H_301_4@ @H_301_4@ 1@H_301_4@ 个参数不再说了,是前面@H_301_4@ @H_301_4@ open@H_301_4@ 函数得到的指针。说了是关键数据结构。@H_301_4@ @H_301_4@

@H_301_4@ 第@H_301_4@ @H_301_4@ 2@H_301_4@ 个参数@H_301_4@ @H_301_4@ const char *sql @H_301_4@ 是一条@H_301_4@ @H_301_4@ sql @H_301_4@ 语句,以@H_301_4@ @H_301_4@ /0@H_301_4@ 结尾。@H_301_4@ @H_301_4@

@H_301_4@ 第@H_301_4@ @H_301_4@ 3@H_301_4@ 个参数@H_301_4@ @H_301_4@ sqlite3_callback @H_301_4@ 是回调,当这条语句执行之后,@H_301_4@ @H_301_4@ sqlite3@H_301_4@ 会去调用你提供的这个函数。@H_301_4@ @H_301_4@

@H_301_4@ 第@H_301_4@ @H_301_4@ 4@H_301_4@ 个参数@H_301_4@ @H_301_4@ void * @H_301_4@ 是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,这个指针比较重要,可以用来作参数的传递。如果不需要传递指针给回调函数,可以填@H_301_4@ @H_301_4@ NULL@H_301_4@ 。等下我们再看回调函数的写法,以及这个参数的使用。@H_301_4@ @H_301_4@

@H_301_4@ 第@H_301_4@ @H_301_4@ 5 @H_301_4@ 个参数@H_301_4@ @H_301_4@ char ** errmsg @H_301_4@ 错误信息。注意是指针的指针。@H_301_4@ @H_301_4@ sqlite3@H_301_4@ 里面有很多固定的错误信息。执行@H_301_4@ @H_301_4@ sqlite3_exec @H_301_4@ 之后,执行失败时可以查阅这个指针(直接@H_301_4@ @H_301_4@ printf(“%s/n”,errmsg)@H_301_4@ )得到一串字符串信息,这串信息告诉你错在什么地方。@H_301_4@ @H_301_4@ sqlite3_exec@H_301_4@ 函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样@H_301_4@ @H_301_4@ sqlite3_exec@H_301_4@ 函数外面就可以通过这个@H_301_4@ @H_301_4@ char*@H_301_4@ 得到具体错误提示。@H_301_4@ @H_301_4@

@H_301_4@ 说明:通常,@H_301_4@ @H_301_4@ sqlite3_callback @H_301_4@ 和它后面的@H_301_4@ @H_301_4@ void * @H_301_4@ 这两个位置都可以填@H_301_4@ @H_301_4@ NULL@H_301_4@ 。填@H_301_4@ @H_301_4@ NULL@H_301_4@ 表示你不需要回调。比如你做@H_301_4@ @H_301_4@ insert @H_301_4@ 操作,做@H_301_4@ @H_301_4@ delete @H_301_4@ 操作,就没有必要使用回调。而当你做@H_301_4@ @H_301_4@ select @H_301_4@ 时,就要使用回调,因为@H_301_4@ @H_301_4@ sqlite3 @H_301_4@ 把数据查出来,得通过回调告诉你查出了什么数据。用@H_301_4@ @H_301_4@ select@H_301_4@ 时也可以用@H_301_4@ sqlite3_get_table@H_301_4@ @H_301_4@ @H_301_4@

查询:@H_301_4@ @H_301_4@

int sqlite3_get_table(@H_301_4@
@H_301_4@
 @H_301_4@ sqlite3 *db, @H_301_4@ @H_301_4@ /* An open database */@H_301_4@ @H_301_4@
@H_301_4@
 @H_301_4@ const char *zsql, @H_301_4@ /* sql to be evaluated */@H_301_4@ @H_301_4@
@H_301_4@
 @H_301_4@ char ***pazResult, @H_301_4@ /* Results of the query */@H_301_4@ @H_301_4@
@H_301_4@
 @H_301_4@ int *pnRow, @H_301_4@ /* Number of result rows written here */@H_301_4@ @H_301_4@
@H_301_4@
 @H_301_4@ int *pnColumn, @H_301_4@ /* Number of result columns written here */@H_301_4@ @H_301_4@
@H_301_4@
 @H_301_4@ char **pzErrmsg @H_301_4@ /* Error msg written here */@H_301_4@ @H_301_4@
@H_301_4@
);@H_301_4@
@H_301_4@
void sqlite3_free_table(char **result); @H_301_4@ //@H_301_4@ 释放内存空间@H_301_4@
@H_301_4@

例子程序:@H_301_4@

#include <stdio.h>@H_301_4@ @H_301_4@ @H_301_4@

#include </usr/local/sqlite-3.3.6/include/sqlite3.h>@H_301_4@ @H_301_4@ @H_301_4@

int main(void){@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ sqlite3 *db;@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ char *zErrMsg = 0;@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ int rc;@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ @H_301_4@ rc = sqlite3_open("text.db",&db); @H_301_4@ //@H_301_4@ @H_301_4@ 打开数据库@H_301_4@ @H_301_4@

@H_301_4@ if( rc ){@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ fprintf(stderr,"Can't open database: %s/n",sqlite3_errmsg(db));@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ sqlite3_close(db);@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ exit(1);@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ }@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ else printf("you have opened a sqlite3 database named text.db sucessfully!");@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ char *sql="create table student(id integer,name varchar(10));"; @H_301_4@ //@H_301_4@ @H_301_4@ 创建表@H_301_4@ @H_301_4@

@H_301_4@ sqlite3_exec(db,sql,&zErrMsg);@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ @H_301_4@ sql="insert into/"student/" values(23,'Lebron');"; @H_301_4@ @H_301_4@ @H_301_4@ 插入记录@H_301_4@ @H_301_4@

@H_301_4@ sqlite3_exec(db,&zErrMsg);@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ int nrow = 0,ncolumn = 0; @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ char **azResult; //@H_301_4@ @H_301_4@ 二维数组存放结果@H_301_4@ @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ //@H_301_4@ @H_301_4@ 查询数据@H_301_4@ @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ /* @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ int sqlite3_get_table(sqlite3*,char***result,int *nrow,int *ncolumn,char **errmsg ); @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ result@H_301_4@ @H_301_4@ 中是以数组的形式存放你所查询的数据,首先是表名,再是数据。@H_301_4@ @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ nrow,ncolumn@H_301_4@ @H_301_4@ 分别为查询语句返回的结果集的行数,列数,没有查到结果时返回@H_301_4@ 0 @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ */ @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ sql = "SELECT * FROM student "; @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ sqlite3_get_table( db,&azResult,&nrow,&ncolumn,&zErrMsg ); @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ int i = 0 ; @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ printf( "row:%d column=%d /n",nrow,ncolumn ); @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ printf( "/nThe result of querying is : /n" ); @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ ) @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ printf( "azResult[%d] = %s/n",i,azResult[i] ); @H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ sql = "DELETE FROM student WHERE ID = 1 ;" ; @H_301_4@ //@H_301_4@ @H_301_4@ 删除记录@H_301_4@ @H_301_4@
sqlite3_exec( db,&zErrMsg );@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ //@H_301_4@ @H_301_4@ 释放掉@H_301_4@ azResult @H_301_4@ @H_301_4@ 的内存空间@H_301_4@ @H_301_4@
sqlite3_free_table( azResult );@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ @H_301_4@ sqlite3_close(db); @H_301_4@ //@H_301_4@ @H_301_4@ 关闭数据库@H_301_4@ @H_301_4@

@H_301_4@ return 0;@H_301_4@ @H_301_4@ @H_301_4@

}@H_301_4@ @H_301_4@ @H_301_4@

<@H_301_4@ @H_301_4@ 上述代码可以在本机@H_301_4@ /root/dada/c3.c@H_301_4@ @H_301_4@ 中找到@H_301_4@ .>@H_301_4@ @H_301_4@ @H_301_4@

@H_301_4@ @H_301_4@

两点说明:@H_301_4@ @H_301_4@

1@H_301_4@ @H_301_4@ @H_301_4@ 程序会在开头定义@H_301_4@ #define _DEBUG_@H_301_4@ @H_301_4@ @H_301_4@ @H_301_4@

#ifdef _DEBUG_
printf("zErrMsg = %s /n",zErrMsg);
#endif @H_301_4@ @H_301_4@ @H_301_4@ @H_301_4@

如果调试的话,即有@H_301_4@ #define _DEBUG_@H_301_4@ @H_301_4@ 就会输出调试的错误信息,否则如果注释掉@H_301_4@ #define _DEBUG@H_301_4@ @H_301_4@ 就不执行这段代码。@H_301_4@ @H_301_4@

@H_301_4@ @H_301_4@

2@H_301_4@ @H_301_4@ rc = sqlite3_open("text.db",&db);@H_301_4@ @H_301_4@ 如果@H_301_4@ text.db@H_301_4@ @H_301_4@ 不存在的话,则是会在@H_301_4@ c3@H_301_4@ @H_301_4@ 文件同目录下自动生成这样一个同名的数据库。@H_301_4@

如何执行一个.db@H_301_4@ 文件@H_301_4@ (通常这个文件不在安装@H_301_4@ sqlite@H_301_4@ @H_301_4@ 的目录路径下):@H_301_4@

# /usr/local/sqlite-3.3.6/bin/sqlite3 text.db @H_301_4@ //( /usr/local/sqlite-3.3.6/bin/sqlite3@H_301_4@ @H_301_4@ 即是程序@H_301_4@ )@H_301_4@ @H_301_4@

若出现错误@H_301_4@ error:while loading shared libraries@H_301_4@ @H_301_4@ 则需要先执行@H_301_4@ ---@H_301_4@ @H_301_4@

export LD_LIBRARY_PATH=/usr/local/sqlite-3.3.6/lib:$LD_LIBRARY_PATH@H_301_4@ @H_301_4@ @H_301_4@

然后就可以进入数据库了:@H_301_4@ sqlite>@H_301_4@ @H_301_4@

原文链接:https://www.f2er.com/sqlite/202870.html

猜你在找的Sqlite相关文章