最近使用较多,这东西现在是越用越着迷,不管是工作或者个人自娱自乐写东西,只要有数据存储首先就想到了,我一直对C/S模式的数据存储很反感,记得在知道之前的很长一段时间里一直用的是xml来存数我的数据,我喜欢将数据存储在单一文件里,我可以随时把数据带在身上,而且它们兼容性够好,拿着数据文件到那里都能用,哪怕是在嵌入式系统里照样玩儿的转…

SQLite特性

  1. ACID事务
  2. 零配置 – 无需安装和管理配置
  3. 储存在单一磁盘文件中的一个完整的数据库
  4. 数据库文件可以在不同字节顺序的机器间自由的共享
  5. 支持数据库大小至2TB
  6. 足够小, 大致3万行C代码, 250K
  7. 比一些流行的数据库在大部分普通数据库操作要快
  8. 简单, 轻松的API
  9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定
  10. 良好注释的源代码, 并且有着90%以上的测试覆盖率
  11. 独立: 没有额外依赖
  12. Source完全的Open, 你可以用于任何用途, 包括出售它
  13. 支持多种开发语言,C, PHP, Perl, Java, ASP.NET,Python

Sqlite安装
现在各大Linux发型版均有现成的软件包可供安装,而且大部份系统都是自带有的,想确认系统里有没有运行下
$sqlite3
非Linux系统到:下载安装
接下来就是sqlite命令行工具的使用

打开或创建数据库
$sqlite3 test.db3
这样就能打开或者创建一个新的数据库文件
$sqlite3 test.db3
SQLite version 3.6.23
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>

它看起来就是这个样子

SQlite内置命令
它除了能执行SQL语句以外还提供一组内置的命令,它们是以点.开始,比如说查看帮助信息就是 .help退出是 .exit.quit

创建表
在命令行里大部份的SQL语句它都是支持的,现在来新建两个表

sqlite>create table Artists (
--->ArtistID INTEGER PRIMARY KEY,
--->ArtistName TEXT);

sqlite 对SQL语句大小写不敏感,所以大写小写随便
sqlite>create table CDs (
--->CDID INTEGER PRIMARY KEY,
--->ArtistID INTEGER NOT NULL,
--->Title TEXT NOT NULL,
--->Date TEXT);


这里注意,除了INTEGER PRIMARY KEY其它字段是都可以是无类型的,也就是不关声明什么或者不声明,这个字段是可以存储任何数据的。

插入数据
sqlite>insert into Artists (ArtistID,ArtistName) values (NULL,'Peter Gabriel');
sqlite>insert into Artists (ArtistID,ArtistName) values (NULL,'Bruce Hornsby');
sqlite>insert into Artists (ArtistID,ArtistName) values (NULL,'Lyle Lovett');
sqlite>insert into Artists (ArtistID,ArtistName) values (NULL,'Beach Boys');

sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,'So','1984');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,'Us','1992');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,2,'The Way It Is','1986');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,2,'Scenes from the Southside','1990');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,'Security','1990');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,3,'Joshua Judges Ruth','1992');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,4,'Pet Sounds','1966');

sqlite是支持导入sql文件的,只要使用内置命令.read即可,比如说我们将以上的命令建成一个sql文件,命名为insert_table.sql

insert into Artists (ArtistID,ArtistName) values (NULL,’Peter Gabriel’);
insert into Artists (ArtistID,ArtistName) values (NULL,’Bruce Hornsby’);
insert into Artists (ArtistID,ArtistName) values (NULL,’Lyle Lovett’);
insert into Artists (ArtistID,ArtistName) values (NULL,’Beach Boys’);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,’So’,’1984′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,’Us’,’1992′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,2,’The Way It Is’,’1986′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,2,’Scenes from the Southside’,’1990′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,’Security’,’1990′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,3,’Joshua Judges Ruth’,’1992′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,4,’Pet Sounds’,’1966′);

接着在命令行里运行
sqlite>.read insert_table.sql

表查询
来看看现在这两张表里都有那些内容,执行
sqlite>select * from Artists;

sqlite>select * from CDs;
如果要同时看表头,请在运行查询语句前打开headers选项
sqlite>.headers ON
输出结果看起来应该是这样子


ArtisID|ArtistName
1 |Peter Gabriel
2 |Bruce Hornsby
3 |Lyle Lovett
4 |Beach Boys


CDID|ArtisID|Title |Date
1 |1 |So |1984
2 |1 |Us |1992
3 |2 |The Way It Is |1986
4 |2 |Scenes from the Southside|1990
5 |1 |Security |1990
6 |3 |Joshua Judges Ruth |1992
7 |4 |Pet Sounds |1966

其它的一些查询语句
sqlite>SELECT Title AS AlbumName FROM CDs;

sqlite>SELECT Title FROM CDs WHERE Date>=1990 ORDER BY Title;

sqlite>SELECT Date FROM CDs;

sqlite>SELECT DISTINCT Date FROM CDs;

sqlite>SELECT Title FROM CDs GROUP BY ArtistID;

多表查询
执行
sqlite>SELECT t1.ArtistName,CDs.Title FROM Artists t1, CDs WHERE t1.ArtistID=CDs.ArtistID
得到的结果
ArtistName |Title
Peter Gabriel|So
Peter Gabriel|Us
Peter Gabriel|Security
Bruce Hornsby|The Way It Is
Bruce Hornsby|Scenes from the Southside
Lyle Lovett |Joshua Judge Ruth
Beach Boys |Pet Sounds

更新字段
插入一条数据
sqlite>insert into Artists (ArtistID,ArtistName) values (NULL,'Supernatural');
如果要更改歌手名字为Santana
sqlite>UPDATE Artists SET ArtistName ='Santana' WHERE ArtistID=5;
即可

删除字段
首先执行
sqlite>select * FROM CDs WHERE Title LIKE 'Super%';
看看是不是想要删除的数据,是的话执行
sqlite>DELETE FROM CDs WHERE Title LIKE 'Super%';
再运行
sqlite>select * FROM CDs WHERE Title LIKE 'Super%';
看看是不是已经删除了?

如果嫌上面的命令行不够直观高效,而你又非常喜欢多用鼠标,那么推荐你安装这个Firefox扩展程序,它真的非常方便。

 

SQLite 3 导入导出操作
2009-06-09 10:41

SQLite 3 导入导出操作

平时使用官方提供的sqlite3.exe工具来操作 sqlite的数据库
进入管理:
sqlite3.exe d:\\test.db //假设数据是 d:\\test.db
>.databases //显示所有数据库 和 mysql的 show databases; 
>.tables //显示当前数据库的表格 和 mysql 的show tables; 
>.schment tablename; //显示表格结构 和mysql的 SHOW CREATE TABLE tbl_name
>.output c:\\\\1.sql
//导出当前数据库的 sql语句 和mysql的 mysqldump
>.dump
>.import c:\\\\1.sql //导入 //mysql 用source
===================
导入
命令: .import
sqlite> .import 文件名 表名
注1: 不要忘了开头的点
注2: 这条语句不能用分号结束. 非SQL不需要分号结束.
注3: 需要查看默认的分隔符separator. 必须一致. 如果不一致可能导致sqlite字段分割错误.
        查看分隔符使用命令 .show , 如果不一致可直接修改, 比如:
        sqlite>.separator ","
        将分隔符转为逗号.
举例1:
将文件a.csv中的数据导入表 tab_xx. (a.csv中字段以逗号分割)
sqlite> .separator ","
sqlite> .import a.csv tab_xx
sqlite>
导入结束.

导出
实现方式: 将输出重定向至文件.
命令: .output
sqlite> .output a.txt
然后输入sql语句, 查询出要导的数据. 查询后,数据不会显示在屏幕上,而直接写入文件.
结束后,输入
sqlite> .output stdout
将输出重定向至屏幕.
举例2:
将 tab_xx 中的数据导出到文件a.txt
sqlite> .output a.txt
sqlite> select * from tab_xx;
sqlite> .output stdout
导出完毕.


//打开mdb数据库    
OleDbConnection mdbConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:英汉字库.mdb");    
mdbConn.Open();    
OleDbDataAdapter mdbDa = new OleDbDataAdapter("select * from English",mdbConn);    
DataSet mdbDs = new DataSet();    
mdbDa.Fill(mdbDs,"English");    
     
//打开sqlite数据库    
SQLiteConnection sqliteConn = new SQLiteConnection("Data Source=database.db;New=True;Compress=True;Version=3");    
sqliteConn.Open();    
    
//建表    
SQLiteCommand sqliteCmd = sqliteConn.CreateCommand();    
sqliteCmd.CommandText = "CREATE table English (English varchar(50) Primary Key,Chinese varchar(50),Phonetic varchar(50))";    
sqliteCmd.ExecuteNonQuery();    
       
//插入数据    
SQLiteDataAdapter sqliteDa = new SQLiteDataAdapter("select * from English", sqliteConn);    
SQLiteCommandBuilder sqliteCb = new SQLiteCommandBuilder(sqliteDa);    
       
DataSet sqliteDs = new DataSet();    
sqliteDa.Fill(sqliteDs,"English");    
    
Console.WriteLine(sqliteDs.Tables["English"].Rows.Count);    
Console.WriteLine(mdbDs.Tables["English"].Rows.Count);    
    
foreach(DataRow dr in mdbDs.Tables["English"].Rows)    
{    
   DataRow sqliteDr = sqliteDs.Tables["English"].NewRow();    
   sqliteDr[0] = dr["english"];    
   sqliteDr[1] = dr["chinese"];    
   sqliteDr[2] = dr["phonetic"];    
   sqliteDs.Tables["English"].Rows.Add(sqliteDr);    
}    
sqliteDa.Update(sqliteDs,"English");

2. 用 SqliteManager 或者 SqliteAdmin 工具可以导入分隔符数据或者excel数据。

 

使用sqlite的文件导入导出功能

转载自http://blog.chinaunix.net/u/10686/showart_585970.html
使用sqlite的文件导入导出功能
导入
命令: .import
sqlite> .import 文件名 表名
注1: 不要忘了开头的点
注2: 这条语句不能用分号结束. 非SQL不需要分号结束.
注3: 需要查看默认的分隔符separator. 必须一致. 如果不一致可能导致sqlite字段分割错误.
        查看分隔符使用命令  .show , 如果不一致可直接修改, 比如:
        sqlite>.separator ","
        将分隔符转为逗号.
举例1:
将文件a.csv中的数据导入表 tab_xx. (a.csv中字段以逗号分割)
sqlite> .separator ","
sqlite> .import a.csv tab_xx
sqlite>
导入结束.

导出
实现方式: 将输出重定向至文件.
命令: .output
sqlite> .output a.txt
然后输入sql语句, 查询出要导的数据. 查询后,数据不会显示在屏幕上,而直接写入文件.
结束后,输入
sqlite> .output stdout
将输出重定向至屏幕.
举例2:
将 tab_xx 中的数据导出到文件a.txt
sqlite> .output a.txt
sqlite> select * from tab_xx;
sqlite> .output stdout
导出完毕.
 
 
用SQLiteManager修改SQLite表结构的问题及解决
作者:wuxingblog  来源:Internet  时间:2006-4-28  【 字体: 】 〖 双击滚屏 〗

SQLiteManager在表结构页面做添加列,修改主键,索引,修改默认值一些修改SQLite表结构的操作的时候.不能对表格本有的一些其它信息进行保存。比如主键信息,默认值信息,自动增长等信息都会丢失,因而导致数据插不进去,如果没有及时发现问题,继续操作,甚至会导致数据的损坏。

本文强烈建议,在进行没有把握或者数据表结构变动等动作比较大的的操作的时候,请先备份数据库。难免造成难以挽回的损失。

本文的解决跟前面的对SQLiteManager的中文问题的解决不同,本文没有提供程序上的BUG修复。一是时间上的问题,二是SQLiteManager又发布了新版,我不可能跟在其后来修改程序,我把问题已经提交给了SQLiteManager原作者,希望他能给我们一个很好的解决方案。

本文的方法可以为修改数据表结构提供参考,也可以为对表结构已经损坏(如默认字段丢失,主键丢失,自动增长字段信息丢失)等的数据来进行修复。

方法是用MySQL SQL语言格式来新写一个新建表格的查询,生成原有的表结构信息,并加上你想要的字段和关系,MySQL的工具支持比较多(EMS MySQL Manager,PhpMyAdmin都是有名的工具,很好用,功能也很强大),而且SQL语句功能也更加强大,而又能获得SQLiteManager的支持。

示范如下:

CREATE TABLE `lm_content` (

  `id` int(10) NOT NULL auto_increment,

  `title` varchar(100) NOT NULL default '',

  `title_alias` varchar(100) NOT NULL default '',

  `introtext` text,

  `bodytext` text,

  `sectionid` int(11) NOT NULL default '0',

  `mask` int(11) NOT NULL default '0',

  `catid` int(11) NOT NULL default '0',

  `created` varchar(20) NOT NULL default '',

  `modified` varchar(20) NOT NULL default '',

  `created_by` int(11) NOT NULL default '0',

  `created_by_alias` varchar(100) NOT NULL default '',

  `published` int(1) NOT NULL default '0',

  `frontpage` int(1) NOT NULL default '0',

  `ordering` int(11) default NULL,

  `metakey` text,

  `metadesc` text,

  `access` int(11) NOT NULL default '0',

  `hits` int(11) NOT NULL default '0',

  `image` varchar(100) default NULL,

  `image_position` varchar(10) default NULL,

  `recorank` int(11) default NULL,

  PRIMARY KEY  (`id`)

)

SQLiteManager能很好地支持MySQL SQL语句。最好不要用SQLiteManager 来新建表格,因为有些信息,如自动增长字段的信息没法设置。然后通过SQLiteManagerOperation下面的复制数据(注意只复制数据,不复制结构!)一项,把原来的数据复制到新表中。

 然后确定数据复制成功,表结构无误后,就将原来的表格删除,再将新建好的表格重命名为原来表格的名字,命名操作也在选中表格后的Operation下。

这个小技巧就介绍完了,我的感想是如果能多学点东西,并融会贯通地使用,会为你的工作带来极大的方便!