SQLite在linux下的安装

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

make
的时候提示错误
../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
……
这个都是tcl 相关的错误, 可以先安装ActiveTcl 以解决. 假如你不需要tcl 支持, 那么这个错误可以这样避免:
# ./configure --disable-tcl --prefix=/usr/local/sqlite-3.3.6
# make    
如果提示没有可以编译的文件,则是第一次make 时已经执行过了,接着下面做就可以了;如果此次是第一次编译,应该不会再提示出错了
# make install
# make doc

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

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

 

二、 SQLite 基本操作

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

sqlite> create table tbl1(one varchar(10), two smallint);
sqlite> insert into tbl1 values('hello!',10);
sqlite> insert into tbl1 values('goodbye', 20);
sqlite> select * from tbl1;
hello!|10
goodbye|20
sqlite>

注意每句SQL 语句后一定要有分号 semicolon

Special commands to sqlite3

sqlite> .help

.databases             List names and files of attached databases
.exit                  Exit this program

.output FILENAME       Send output to FILENAME
.output stdout         Send output to the screen

.tables                List the tables

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

 

三、C/C++SQLite 编程

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

找到安装SQLite 的路径:

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

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

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

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

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

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

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

继续编译

出现 " error while loading shared libraries " 等错误

我们可以这样解决:
方法一:静态编译

在编译时加上 -static 参数,例如

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

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

方法二:重新配置系统环境变量 LD_LIBRARY_PATH
这时需要指定 libsqlite3.so.0 库文件的路径 , 也就是配置系统环境变量 LD_LIBRARY_PATH

使系统能够找到 libsqlite3.so.0

好了,现在我们来指定系统环境变量 LD_LIBRARY_PATH 的值
shell 下输入:

[root@localhost temp]#
export LD_LIBRARY_PATH=/usr/local/sqlite3/lib:$LD_LIBRARY_PATH
看看现在系统环境设置:
[root@localhost temp]#env

….

LD_LIBRARY_PATH=/usr/local/sqlite3/lib:

….. ( 看到了吧, LD_LIBRARY_PATH 这一行开始就是 sqlite3 的库文件路径: )
去掉 -static , 再编译:

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

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

 

常用函数

int sqlite3_open(

  
const char *filename,   
/* Database filename (UTF-8) */


  
sqlite3 **ppDb          
/* OUT: SQLite db handle */


);



int sqlite3_close(sqlite3 *);

int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *,  char **errmsg );

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

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

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

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

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

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

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

查询:

int sqlite3_get_table(

  
sqlite3 *db,   
       
/* An open database */


  
const char *zSql,     
/* SQL to be evaluated */


  
char ***pazResult,    
/* Results of the query */


  
int *pnRow,           
/* Number of result rows written here */


  
int *pnColumn,        
/* Number of result columns written here */


  
char **pzErrmsg       
/* Error msg written here */


);

void sqlite3_free_table(char **result);   
//
释放内存空间

例子程序:

#include <stdio.h>

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

int main(void){

  sqlite3 *db;

  char *zErrMsg = 0;

  int rc;

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

  if( rc ){

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

    sqlite3_close(db);

    exit(1);

  }

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

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

  sqlite3_exec(db,sql,0,0,&zErrMsg);

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

  sqlite3_exec(db,sql,0,0,&zErrMsg);

    int nrow = 0, ncolumn = 0;

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

  // 查询数据

   /*

  int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg );

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

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

  */

  sql = "SELECT * FROM student ";

  sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );

  int i = 0 ;

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

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

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

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

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

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

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

  return 0;

}

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

 

两点说明:

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

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

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

 

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值