第一讲
什么是sqlite?
为什么要用?
如何获得?如何安装?
如何管理?
如何使用Perl存取sqlite的数据;
如何用C或C++;
sqlite不支持的sql特性;
自包含,没有服务器,零配置,支持事务。
sqlite的数据库就一个文件,包括:多表、索引、触发器、和视图;
sqlite直接读写磁盘上的文件。
事务的四个特性(ACID)atomic(原子的)、consistent(一致的)、isolated(独立的)、durable(持久的)
实现大部分sql92标准
整个数据库存储在一个跨平台的数据文件上;
支持的数据库大小能够达到TB,支持GB的字符串或BLOBs(二进制信息)。
所有功能都编译进去250KB,选择一些特性可以缩小到150KB;
sqlite不支持并发,不是两个进程同时访问,独占式的
代码质量高,99%的代码都经过测试;
自包含的意思,就是不依赖外界的任何库;
sqlite的设计目标是一切从简:
管理方便;
使用方便;
容易嵌套到其它程序;
维护和定制容易;
sqlite的目的不是取代ORACLE,而是用于取代fopen();
著名使用sqlite的客户:
Adobe
苹果
firefox
GE
google
微软
麦咖啡
skype
sqlite能够很好工作的场景;
保存应用程序的配置信息;
嵌入式设备和应用程序;
小网站,原型系统。如果大网站并发性高,还是建议用MysqL;
取代,随意的混乱的磁盘文件;
内部或临时的数据库;
命令行的数据分析工具;
做演示或者测试的时候;
阅读sqlite的源码,学习数据库技术;
对sql语言的新特性进行扩展;
第二讲
管理工具
源码级别安装
已经编译好的可执行文件,for windows或linux;
下载源码自己编译;
源代码:
amalgamation版本,把很多细小的东西合并成一个大家伙。
linux下演示怎么编译;
操作系统是CentOS5.2
chmod +x sqlite3-3.6.3.bin
./sqlite3-3.6.3.bin
和windows下一样,进入sqlite shell
tar zxvf sqlite-amalgamation-3.6.3.tar.gz
源代码安装的三部曲:
configure;
make;
make install;
sqlite的源码安装过程:
./configure --prefix=/opt/sqlite3
--prefix 表明目标文件安装在什么目录下,不指定安装在缺省目录下/usr/local/之类的。
gcc一定要装
输入make开始编译;
输入make install,把文件copy到目标目录下;
安装之后,去/opt/sqlite3下看看,就三个目录:bin、include、lib
标准的软件布局结构
lib下有静态库和动态库,推荐用动态库
sqlite3.exe是shell.c,2千多行源代码实现了简单的命令行工具;
动态库是sqlite3.c
sqlite3工具的功能:
创建数据库;
执行sql命令;
查询数据库的表结构,或其它对象的结构;
导入和导出数据;
改变输出格式;
使用在shell脚本中;学会shell自动化脚本编程;
输入sql语句的时候,结束一定要用分号,这也是sql的标准;
linux下把sqlite加入PATH路径,这样在任何路径下都能够使用sqlite3;
# echo $PATH
cp /opt/sqlite3/bin/sqlite3 /usr/local/bin
系统表sqlITE_MASTER,存放database schema
不能对sqlITE_MASTER表进行DROP TABLE,UPDATE,INSERT,DELETE操作
临时表存储在sqlite_temp_master中。
sqlite除了数据库文件之外,在运行过程中会产生一些临时文件。
sqlite3只是一个壳,真正执行,还是会调用sqlite的库;可以研究一下。
sqlite3本身的命令以“.”开始,.help;
sql PLUS有三大类命令:
sql命令,提交给数据库引擎;
PL sql 命令,提交给数据库引擎;
sql PLUS本身的命令,本地执行;
第三讲
sqlite3本身的命令
.help
改变输出格式的命令;
csv,以逗号分隔的记录;
.mode命令在8种显示格式中进行切换;
默认是list模式,默认的分隔线是“|”;
list模式特别适合用于AWK;
line模式,每列都单独一行,列名等于列值,记录之间有空行;
column模式,与sql PLUS中的缺省模式相同;.header on 打开头,.header off 关闭头;此模式可读性比较好;
.width 3 30,第一列最长3,第二列最长30;
insert模式,产生INSERT的sql语句,挺有意思;.mode insert 目标表名;
html模式,XHTML table,适合做CGI处理;
list模式一行一条记录,每列竖线分隔;
linux,unix的设计思想是小而美,一个工具只干一件事情。通过管道把命令串联起来;
默认查询结果是写到屏幕上,也可以写到一个文件中。使用.output命令;
.output stdout,输出又回到了屏幕上;
查询Database Schema,就是表结构、数据库结构;
.tables,可以看数据库中的所有表;
.indices,可以列出一个指定表的所有索引;
.schema,创建表和索引时候的create语句,也可以在后面指明表名;
.databases,查看当前打开的所有数据库,通常是一个main一个temp;
第四讲
把整个数据库导成ASC文本文件的功能;
.dump命令;导出的sql语句,可以放到ORACLE中去执行;
一个生成数据库归档copy的命令;
$ echo ".dump" | sqlite3 ex1 | gzip -c > ex1dmp.gz
重构数据库的命令:
zcat ex1dmp.gz | sqlite3 ex2
从sqlite3中提取数据,导到其它流行的数据库中;
.explain命令
EXPLAIN命令,就是查询一条sql语句最终解析出来的执行计划。ORACLE中也有,对sql语句调优很有用;
一条sql语句的处理过程:解析、分析、执行,看看sql语句的效率;
> .explain
> explain select * from t;
.timeout命令
默认超时时间是0,查询一张表或索引,发现表或索引被锁定,就立刻返回,不等待;
sqlite只适合一个进程访问,不适合多进程的并发访问;
在SHELL中使用sqlite3的命令;
sqlite3命令的输入和输出都可以重定向,常用的使用模式;
sql语句中,除了分号结束,用GO或者/也可以执行;
# sqlite3 demo.db "select * from t"
一个简单的shell脚本
shell脚本的开头一定要有一个"#!",这是规定。
成对的EOF之间的东西都被原样导入sqlite中;here document技术;
shell里面调用交互式程序的方法;
如何使用Perl脚本访问sqlite数据库;
Perl,老牌语言,有20年历史,但在走下坡路,被python或者ruby渐渐取代;
Perl在北美比较流行;
工作中使用的工具是Perl+shell;
把Perl形容为瑞士军刀,但可读性差;
ruby适合web快速开发;
perl对系统管理和生物信息处理比较厉害;
windows平台下 ActiveStat Perl www.activestate.com 免费
Linux/Unix www.perl.org
DBI
运行一段小程序,确定perl是否安装了对sqlite的支持;
perl需要sqlite的驱动,来访问sqlite的数据库,如果没装,还需要安装一下;
第五讲
本讲主题,如何使用perl和C语言访问sqlite3数据库;
使用perl访问sqlite数据库
检查perl是否安装了sqlite驱动程序的代码;
perl访问数据库都用DBI接口,在DBI之下有DBD(数据库驱动),分别开发支持MysqL,oracle等;
一个基本的插入操作代码演示;
先和数据库建立连接;
做些准备工作;
执行语句;
判断是否出错;
提交;
断开;
一个基本的查询操作代码演示:
查询语句执行的时候,先执行prepare;
然后执行;
提取结果集,先把每列绑定到变量上,然后在while循环中进行fetch;
完成,释放结果集;
断开连接;
使用C语言访问sqlite
两个对象
数据库连接对象:sqlite3;控制连接;
语句执行对象:sqlite3_stmt;控制sql语句;
常用的六个接口函数,操作sqlite的核心函数:
sqlite3_open()
sqlite3_prepare()
sqlite3_step(),类似fetch功能;
sqlite3_column()
sqlite3_finalize()
sqlite3_close(),断开连接;
sqlitedemo.c
#include
sqlite3_errmsg(db);获得失败的原因;
回调函数的作用;
执行完查询,自动调用回调函数,把查询的结果打印出来。
编译程序要用到头文件和lib库。这次使用静态库。
# gcc -v 看看有没有gcc
编译命令
# gcc -I/opt/sqlite3/include -L/opt/sqlite3/lib -lsqlite3 sqlite3demo.c -o dbtest
-I头文件搜索路径
-L库文件搜索路径
-l库文件
sqlite的局限性:
官方网站上有大小的支持;
不支持外键约束;
对触发器的支持不是很完整;
对ALTER TABLE的支持不是很完整;
不支持嵌入式事务;
不支持有连接和FULL OUTER JOIN.
不支持视图的写操作;
不支持GRANT和REVOKE;