转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]
本文链接:?http://www.php-oa.com/2009/12/21/perl-sqlite.html
Perl使用sqlite和使用mysql一样容易.非常喜欢这种风格.
Perl 使用 sqlite
SQLite模块定义的“数据库”是存在于单个文件中的,把单个文件仿真为一个数据库。这个还是相当方便的. 当我们在使用perl的DBI连接时,dbname参数指定为该文件名。
不像大多数的关系型数据库,在DBD::SQLite定义的数据库不是服务器/客户短架构,没有服务器,它直接与文件交换数据。 多个进程可以同时从一个文件中读取数据(此时用SELECTs命令),但是只有一个进程能向文件中写数据(当一个进程写数据的时候其它的进程被挂起)。
SQLite支持事务功能,也就是,你可以向多个表做出一系列改动,但是只要你不向SQLite提交这些改动,更新就不会写到文件中。
SQLite定义的数据库里面没有数据类型这个概念。不管你在创建一个表的时候指定的是什么数据类型,以后你可以在其中放入任何类型的数值(包括字符型,数字型,日期型,二进制对象/blob)。实际上,创建表的时候你甚至可以不指定数据类型。 CREATE TABLE people ( id,name,age); SQLite只有在要比较数据的时候,如用WHERE 子句或对某些值进行排序,才会考虑数据类型。SQLite在比较数据的时候,只考虑被比较对象的类型,而不管被比较对象所在列的其它数据是什么类型。像 Perl一样,SQLite只能识别字符型和数字型。两个数值总是以浮点类型进行比较,两个字符串直接比较。当不同类型的数据比较的时候,数字总是比字符小。
只有一种情况SQLite才会关心你为某一列申明的数据类型(需要创建一个值自增加的列的时候)。你可以把这列的类型指定为:“INTEGER PRIMARY KEY”。 CREATET ABLE people( id INTEGER PRIMARY KEY,age);
SQLite支持8位长的字符编码,但是不识别ASCII中的NULL符“ ”。唯一的变通方法就是在你存储数据之前自行编码,然后在取出数据之后再手工解码,就象URL编码或Base64编码方式一样。这甚至可以用在BLOB字段里面。
use DBI; $dbh=DBI->connect(“dbi:SQLite:dbname=./info.db”,”",{RaiseError=>1,AutoCommit=>0}); # 在perl中,sqlite建表 my $sql = “create table ip (id int null,name int null)”; $dbh->do( $sql); # 使用perl来更新sqlite的表内容 my $sql = “alter table ip add column age varchar(1024) null”; $dbh->do( $sql); # 插入数据 my $sql = “insert into name values( 1,2,‘myname’)”; $dbh->do( $sql ); if ( $dbh->err() ) { die “$DBI::errstrn”; } $dbh->commit(); # 查询数据 $sql = “select * from ip”; my $dbconn = $dbh->prepare($sql); $dbconn->execute(); while ( my @row_ary = $dbconn->fetchrow_array ){ my ($cc,$bb,$dd) = @row_ary; } $dbh->disconnect();
?
SQLite 插入时使用事件
SQLite的数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。如果写入大量的数据时,记的要使用事件,我插入6W条数据。不使用事件要用10分钟,使用事件只有3秒.
对 sqlite 速度进行了一下简单的测试
查5k日志中的ip地址信息
1.建表后默认的速度 sqlite的查找速度用时
real 3m53.812s
2.建索引后