# 第2章 入门
无论您使用何种操作系统,SQLite都很容易上手。对大多数用户,安装SQLite并创建一个新的数据库不会超过5分钟,且不需要任何经验。
空注:本章我只看了Windows操作系统下使用VC的内容。
## 从哪得到SQLite
SQLite网站(www.sqlite.org)同时提供SQLite的已编译版本和源程序。编译版本可同时适用于Windows和Linux。
有几种形式的二进制包供选择,以适应SQLite的不同使用方式。包括:
+ 静态链接的命令行程序(CLP)
+ SQLite动态链接库(DLL)
+ Tcl扩展
SQLite源代码以两种形式提供,以适应不同的平台。一种为了在Windows下编译,另一种为了在POSIX平台(如Linux, BSD, and Solaris)下编译,这两种形式下源代码本身是没有差别的。
## 在Windows上使用SQLite
无论你是作为终端用户还是作为程序员来使用SQLite,SQLite都可以很容易地安装在Windows环境下。本节我们将讨论所有相关的内容——安装二进制包或在最普通的编译环境下使用源代码。
## 获得命令行程序
SQLite命令行程序(CLP)是开始使用SQLite的一个比较好的选择。
略,参原文。
## 获得SQLite的动态链接库(DLL)
SQLite的DLL文件供编译好的程序动态连接SQLite。大多数使用SQLite的软件都会拥有自己的SQLite DLL拷贝并随软件自动安装。
## 在Windows环境下编译SQLite源代码
在Windows环境下编译SQLite源代码是很简单的。根据你所使用的编译器和你要做什么,有几种方法来编译SQLite。最常见的环境是Microsoft Visual C++或MinGW,本节都会加以介绍。关于使用其它编译器编译SQLite的内容,可参考SQLite Wiki (www.sqlite.org/cvstrac/wiki?p=HowToCompile)。
## 用Microsoft Visual C++构建SQLite DLL
通过以下步聚,可使用源代码,在Visual C++上构建SQLite DLL:
1\. 启动Visual Studio。在解包的SQLite源程序目录中创建一个新的DLL“空”项目。
高:不同版本操作略有不同,不详细解释了。
2\. 将全部SQLite源文件加入到项目中来。包括所有的.c文件和.h文件。除了:
shell.c:该文件包括main()函数,用于创建CLP可执行程序。
tclsqlite.c:该文件用于TCL支持。
空注:我使用的版本(sqlite-source-3_6_18.zip)有些函数有重复定义,还得去掉两个文件,不知会引起什么后果,它们是fts3.c和fts3_tokenizer.c。
3\. 执行构建(Build)命令,OK。
还可以选择构建线程完全的DLL或发布 (Release) 版的DLL,参原文。
## 用Microsoft Visual C++构建SQLite CLP
方法基本同上。
创建项目时选择Win32 Console Application,添加文件时把shell.c也加上,即可。
## 使用SQLite数据库
SQLite的CLP是使用和管理SQLite数据库最常用的方法。
它可运行于多种平台,学会使用CLP,可以保证你永远有一个通用和熟悉的途径来管理你的数据库。CLP其实是两个程序。它可以运行在命令行模式下完成各种数据库管理任务,也可以运行在Shell模式下,以交互的方式执行查询操作。
## Shell模式下使用CLP
运行DOS shell,进入工作目录,在命令行上键入sqlite3命令,命令后跟随一个可选的数据库文件名。如果在命令行上不指定数据库名,SQLite将会使用一个内存数据库,其内容在退出CLP时将会丢失。
CLP以交互形式运行,你可以在其上执行查询、获得schema信息、导入/导出数据和执行其它各种各样的数据库任务。CLP认为你输入的任何语句都是一个查询命令(query),除非命令是以点(.)开始,这些命令用于特殊操作。键入.help或.h可以得到这些操作的完整列表。键入.exit 或.e退出CLP。
让我们从创建一个称为test.db的数据库开始。在DOS shell下键入:
sqlite3 test.db
尽管我们提供了数据库名,但如果这个数据库并不存在,SQLite并不会真正地创建它。SQLite会等到你真正地向其中增加了数据库对象之后才创建它,比如在其中创建了表或视图。这样做的原因是给你机会在将数据库写到外部文件之前对数据库做一些永久性的设置,如页的大小等。有些设置,如页大小、字符集(UTF-8或UTF-16)等,一旦数据库创建之后就不能再修改了。这个中间期是你能改它们的唯一机会。我们采用默认设置,因此,要将数据库写到磁盘,我们仅需要在其中创建一个表。输入如下语句:
sqlite> create table test (id integer primary key, value text);
现在你有了一个称为test.db的数据库文件,其中包含一个表test,该表包含两个字段。
+ 一个称为id的主键字段,它带有自动增长属性。无论何时你定义一个整型主键字段,SQLite 都会对该字段应用自动增长属性。
+ 一个简单的称为value的文本字段。
向表中插入几行数据:
```
sqlite> insert into test (value) values('eenie');
sqlite> insert into test (value) values('meenie');
sqlite> insert into test (value) values('miny');
sqlite> insert into test (value) values('mo');
```
将插入的数据取回:
```
sqlite> .mode col
sqlite> .headers on
sqlite> SELECT * FROM test;
```
系统显示:
```
id value
1 eenie
2 meenie
3 miny
4 mo
```
SELECT语句前的两个命令(.headers and .mode)用于改进输出的格式。可以看到SQLite为id字段赋予了连接的整数值,而这些值我们在INSERT语句中并没的提供。对于自动增长的字段,你可能会关心最后插入的一条记录该字段的取值,此值可以用SQL函数last_insert_rowid()得到。
```
sqlite> select last_insert_rowid();
last_insert_rowid()
4
```
在退出CLP之前,让我们来为数据库创建一个索引和一个视图,后面的内容中将会用到它们。
```
sqlite> create index test_idx on test (value);
sqlite> create view schema as select * from sqlite_master;
```
使用.exit命令退出CLP。
```
sqlite> .exit
C:\Temp>
```
### 获得数据库的Schema信息
有几个shell命令用于获得有关数据库内容的信息。你可以键入命令.tables [pattern]来得到所有表和视图的列表,其中[pattern]可以是任何类SQL的操作符。执行上述命令会返回符合条件的所有表和视图,如果没有pattern项,返回所有表和视图。
```
sqlite> .tables
schema test
```
可以看到我们创建的表test和视图schema。同样的,要显示一个表的索引,可以键入命令.indices [table name]:
```
sqlite> .indices test
test_idx
```
可以看到我们为表test所创建的名为test_idx的索引。使用.schema [table name]可以得到一个表或视图的定义(DDL)语句。如果没提供表名,则返回所有数据库对象(包括table、indexe、view和index)的定义语句:
```
sqlite> .schema test
CREATE TABLE test (id integer primary key, value text);
CREATE INDEX test_idx on test (value);
sqlite> .schema
CREATE TABLE test (id integer primary key, value text);
CREATE VIEW schema as select * from sqlite_master;
CREATE INDEX test_idx on test (value);
```
更详细的schema信息可以通过SQLite唯一的一个系统视图sqlite_master得到。这个视图是一个系统目录,它的结构如表2-1所示。
表2-1 sqlite_master表结构
| 编号 | 字段 | 说明 |
| --- | --- | --- |
| 1 | type | 值为"table"、 "index"、 "trigger"或"view"之一。 |
| 2 | name | 对象名称,值为字符串。 |
| 3 | tbl_name | 如果是表或视图对象,此字段值与字段2相同。如果是索引或触发器对象,此字段值为与其相关的表名。 |
| 4 | rootpage | 对触发器或视图对象,此字段值为0。对表或索引对象,此字段值为其根页的编号。 |
| 5 | SQL | 字符串,创建此对象时所使用的SQL语句。 |
查询当前数据库的sqlite_master表,返回:
```
sqlite> .mode col
sqlite> .headers on
sqlite> select type, name, tbl_name, sql from sqlite_master order by type;
type name tbl_name sql
---------
index test_idx test CREATE INDEX test_idx on test (value)
table test test CREATE TABLE test (id integer primary
view schema schema CREATE VIEW schema as select * from s
```
■Tip:使用向上的箭头键可以回滚到前面输入过的命令。
### 数据导出
可以使用.dump命令将数据库导出为SQL格式的文件。不使用任何参数,.dump将导出整个数据库。如果提供参数,CLP把参数理解为表名或视图名。
```
sqlite> .output file.sql
sqlite> .dump
sqlite> .output stdout
```
### 数据导入
有两种方法可以导入数据,用哪种方法决定于要导入的文件的格式。如果文件由SQL语句构成,可以使用.read命令导入(执行)文件。如果文件是由逗号或其它定界符分隔的值(comma-separated values, CSV)组成,可使用.import [file][table]命令。此命令将解析指定的文件并尝试将数据插入到指定的表中。
```
sqlite> .show
echo: off
explain: off
headers: on
mode: column
nullvalue: ""
output: stdout
separator: "|"
width:
```
.read命令用来导入由.dump命令创建的文件。如果要使用前面作为备份文件所导出的file.sql,需要先移除已经存在的数据库对象(test表和schema视图),然后用下面方法导入:
```
sqlite> drop table test;
sqlite> drop view schema;
sqlite> .read file.sql
```
### 格式化
CLP提供了几个格式化选项命令。最简单的是.echo, 如果设置.echo on,则新输入的命令在执行前都会回显,默认值是off。.headers设置为on时,查询结果显示时带有字段名。当遇到NULL值时,如果需要以一个字符串来显示,使用.nullvalue命令设置,如:
```
sqlite> .nullvalue NULL
```
默认情况下使用空串。如果要改变CLP的shell提示符,使用.prompt [value],如:
```
sqlite> .prompt 'sqlite3> '
sqlite3>
```
.mode命令可以设置结果数据的几种输出格式。可选的格式为csv、column、html、insert、line、list、tabs和tcl。默认值是list,在此模式下显示结果时列间以默认的分隔符分隔。如果你想以CSV格式输出一个表的数据,可如下操作:
```
sqlite3> .output file.csv
sqlite3> .separator ,
sqlite3> select * from test;
sqlite3> .output stdout
```
文件file.csv的内容为:
```
1,eenie
2,meenie
3,miny
4,mo
```
因为有一个CSV模式,所以下面的命令会得到相似的结果:
```
sqlite3> .output file.csv
sqlite3> .mode csv
sqlite3> select * from test;
sqlite3> .output stdout
```
## 在命令行方式下执行CLP
在DOS或UNIX的命令行方式下,直接执行SQLite的数据库操作。
## 数据库管理
所有的数据库管理任务都可以在shell和命令行模式下完成。
## 创建、备份和删除数据库
数据库的备份有两种方法。第1种是使用.dump,可得到SQL格式的文件。在命令行方式下可如下做:
```
sqlite3 test.db .dump > test.sql
```
在CLP中可如下做:
```
sqlite> .output file.sql
sqlite> .dump
sqlite> .exit
```
相应地,导入一个SQL格式备份的数据库可如下做:
```
sqlite3 test.db < test.sql
```
此处假设test.db不存在。如果它存在,则或许会因为数据库中有同名的对象而出错。
可以用复制的方法得到一个二进制的数据库文件拷贝。但也许在复制之前你想先抽空(vacuum)它,也就是释放数据库文件中未使用的空间,以得到一个更小的数据库文件。可操作如下:
```
sqlite3 test.db VACUUM
cp test.db test.backup
```
一般情况下,二进制的备份如不SQL备份兼容性好。尽管SQLite有很好的向上兼容性和各操作系统间文件格式的一致性,但如果想要将备份文件保留很长时间,还是SQL格式保险一些。
当一个数据库你不想再用时,简单地从操作系统中将其文件删除就行了。
## 获得数据库文件的信息
按前文所述,获得数据库信息的主要途径是使用sqlite_master视图,它提供一个数据库所包含的所有对象的细节信息。
如果你想获得关于物理的数据库结构信息,可以使用一个称为SQLite Analyzer的工具,它可以在SQLite网站上下载得到。SQLite Analyzer可以提供磁盘SQLite数据库的详细技术信息。
(输出结果略)
## 其它SQLite工具
有很多其它开源的或商业的程序可工作于SQLite,其中具有优秀图形化界面且跨平台的有:
+ SQLite Database Browser (http://sqlitebrowser.sourceforge.net)
+ SQLite Control Center (http://bobmanc.home.comcast.net/sqlitecc.html)
+ SQLiteManager (www.sqlabs.net/sqlitemanager.php)