命令行shell 用于SQLite

来源:互联网 发布:windows正版好处 编辑:程序博客网 时间:2024/04/29 16:10

转http://www.helplib.net/s/sqlite/9/15.shtml


SQLite 库包含了一个简单的命令行实用工具命名sqlite3 (或sqlite3exe 在windows 上), 它允许用户手动输入并执行SQL 命令针对一个SQLite 数据库此文档提供了有关如何使用简要介绍sqlite3 程序

使用入门

要启动"sqlite3 程序时, 只需键入"sqlite3 ", 后跟该文件SQLite , 该数据库如果该文件不存在, 则自动"sqlite3 程序将提示您要输入SQL在SQL 语句类型(由一个semicolon) 终止, SQL 按"enter ", 将会被执行

例如, 要创建一个新的名为"ex1 "SQLite 数据库使用一个"tbl1 名为的表", 可能会这样做:

$sqlite3 ex1 SQLite 版本3611 输入"帮助"有关说明用"; "输入SQL 语句终止sqlite > create table tbl1(one varchar(10) , 两个smallint) ;sqlite > insert into tbl1 values( ''hello! '', 10) ;sqlite > insert into tbl1 values( ''goodbye '' , 20) ;sqlite > select *from tbl1 ;hello!|10 goodbye|20 sqlite > 

通过键入以下命令可以终止sqlite3 程序您的系统End-Of-File 字符(通常为Control-D)使用中断字符(通常是一个Control-C) 停止长时间运行的SQL 语句

请确认您键入一个分号!的每个SQL 命令结束时, sqlite3 程序时查找一个分号知道您的SQL 命令如果省略分号, sqlite3 将给您继续符如果提示, 等待输入更多文本添加到当前SQL 命令此功能允许您要输入SQL 横跨多行例如:

sqlite > CREATE TABLE tbl2 (...> f1 varchar(30 )主键, ...> f2 文本....> f3 实数...> );sqlite > 

除: 仅使用SQLITE_MASTER 表

将显示"数据库模式中的一个SQLite 数据库是存储在一个特殊的表格"sqlite_master "可以为特殊sqlite_master 表执行"SELECT "语句就像任何其他表在SQLite 数据库例如:

$sqlite3 ex1 SQLite 版本3611 输入"帮助"有关说明sqlite > select *from sqlite_master ;类型=表名称=tbl1 tbl_name =tbl1 rootpage =3sql =create table tbl1(one varchar(10) , 两个smallint )sqlite > 

但不能执行DROP TABLE, UPDATE, INSERT 或DELETE 对sqlite_master 表在sqlite_master 表自动为您创建或更新从数据库中删除表及索引不能手动修改sqlite_master 表

此模式的TEMPORARY 表没有存储在TEMPORARY "sqlite_master "表中的表是不可见的应用程序, 创建该表的应用程序此模式的TEMPORARY 表是存储在另一个特殊的表格"sqlite_temp_master """sqlite_temp_master "表是临时本身

特殊命令来sqlite3

在大多数情况下, sqlite3 上读取的输入, 并把它们拖到SQLite 库为执行但是, 如果一个输入行以点号("") 该行, 然后是截取和nocase sqlite3 程序本身"时, 通常使用这些"dot 命令来更改输出的格式, 或要执行的某些自带的查询的查询语句

有关服务器可用的点命令, 您可以输入"帮助"在任意时间例如:

sqlite > 帮助备份? DB?  FILE 备份DB (默认"main ")来FILE bail ON|OFF 停止后, 一个错误默认OFF 列表名的数据库和文件附加数据库转储? TABLE? 转储到数据库中SQL 文字格式回音式ON|OFF 打开或关闭命令回显exit 退出该程序解释ON|OFF 关闭或输出模式适合于EXPLAIN genfkey ? OPTIONS?  选项有: --no-drop : 请不要删除旧fkey 触发器--ignore-errors : 忽略表提供fkey 错误--exec : 立即执行生成的SQL 请参阅文件tool/genfkeyREADME 在源分发以获得进一步的信息header(s )ON|OFF 关闭或显示的标题help 显示此消息导入FILE TABLE 在FILE TABLE 用于分隔索引TABLE 只显示指定的TABLE 上的所有索引iotrace FILE 启用I/O 诊断日志记录设置为FILE 加载FILE ? ENTRY?  加载扩展库模式MODE ? TABLE?  设置输出模式其中MODE 是以下值之一: csv 以逗号分隔的值列居中的列(参见宽度)html HTML < 表格> 代码为TABLE 插入SQL insert 语句行每行对应一个值列表中的值用分号分隔分隔字符串标签tab-separated 值tcl TCL 列表元素nullvalue 将STRING 打印STRING 代替NULL 值输出FILENAME 发送输出以FILENAME 输出stdout 发送输出到屏幕提示MAIN CONTINUE 替换标准提示quit 退出该程序在FILENAME 读取FILENAME 执行SQL 还原? DB?  FILE 还原DB 内容(默认的"main ")从FILE 架构? TABLE?  显示CREATE 语句输出模式和使用的分隔符STRING 更改分隔符导入显示显示当前的不同设置的值表? PATTERN?  列表中的名称相匹配的表LIKE 图案MS 请尝试打开MS 表锁定毫秒后超时定时器ON|OFF 关闭或CPU 计时器测量宽度NUM NUM设置"column 列宽"模式sqlite > 

更改输出格式

在sqlite3 程序能够显示查询的结果在八种不同的格式: "csv ""column ""html ""insert ""line ""list ""tabs "和"tcl "可以使用"模式"点命令要切换这些输出格式

输出模式的默认设置是"list "在"位置"中, 每个记录列表写入一次查询中每一行输出和记录是一个特定的分隔符分隔的字符串默认分隔符是一个管道符号("| ")列出模式时特别有用创建一个查询的输出发送给其他程序(例如用于其他处理的AWK)

sqlite > 模式列表sqlite > select *from tbl1 ;hello|10 goodbye|20 sqlite > 

可以使用"分隔符"点命令更改分隔符为列表模式例如, 要将插入一个逗号和空格, 您也可以这样做:

sqlite > 分隔符", "sqlite > select *from tbl1 ;"你好, 10 再见, 20 sqlite > 

在"line "模式下, 每一个列与数据库中的某行都在单独一行每行由等号列名, 并进行适当的更改连续记录通过一个空行分隔下面是一个例子模式行的输出:

sqlite > 模式行sqlite > select *from tbl1 ;一个=hello 两个=10 一个=再见两个=20 sqlite > 

在列模式中, 每个记录都在单独的一行中对齐与数据列例如:

sqlite > 模式列sqlite > select *from tbl1 ;一个两个---------- ---------- hello 10 再见20 sqlite > 

默认情况下, 每个列至少为10 个字符宽数据太大以适合列被截断使用"可以调整列宽宽度&w"命令像这样:

sqlite > 宽度12 6sqlite > select *from tbl1 ;一个两个------------ ------ hello 10 再见20 sqlite > 

"宽度&w"命令在以上示例中第一列的宽度设为指定值.以12 并第三列的宽度为6要查看所有其他列宽可以给出任意数量的参数来"在必要时宽度&w"以指定的列宽的任意多个列在您的查询结果

如果指定列的宽度值为0然后的列宽自动调整是最多只能有三个数字: 10页眉的宽度首行的宽度, 并将该数据这将使列宽self-adjusting每一列的宽度设置此auto-adjusting 默认值为0值

标志所在列的列标出现在前两行输出可以使用"打开和关闭header"点命令在上面的示例中, 列标签都在已开启您也可以这样做:

sqlite > 页眉处于关闭状态sqlite > select *from tbl1 ;hello 10 再见20 sqlite > 

另一个有用的输出模式是"insert "在插入模式下, 则输出将会在格式化为看起来像是SQL INSERT 语句可以使用insert 模式来生成可以用来输入数据到不同的数据库

当指定插入模式, 您要创建一个额外的参数的名称输入的表不存档例如:

sqlite > 插入new_table 模式sqlite > select *from tbl1 ;INSERT INTO ''new_table "VALUES( ''hello '', 10); INSERT INTO ''new_table "VALUES( ''goodbye '', 20); sqlite > 

最后一个输出模式为"html "在此模式下, sqlite3 写入查询的结果作为XHTML 表开始< TABLE > 和终止< /TABLE > 都不进行写入但所有罪< TR > s< TH > s和< TD > s是html输出的模式为CGI _ganglia.py 标为很有用

将结果写入一个文件

默认情况下, sqlite3 会发送: 使用"可以更改此"命令的输出只需将输出文件的名称为一个参数输出命令及所有后续查询结果将写入该文件使用"输出stdout "以开始写入标准输出例如:

sqlite > 模式列表sqlite > 分隔符| sqlite > 输出test_file_1文本文件txt sqlite > select *from tbl1 ;sqlite > 退出$cat test_file_1文本文件txt hello|10 goodbye|20 $

提交到数据库模式

指定sqlite3 程序提供了几个方便命令会非常有用启动时, 模式的数据库服务器名无效文档这些命令执行不能执行某些其他方式这些命令都提供了纯粹作为一种快捷方式

例如, 来查看数据库中的表的列表, 可以输入"表"

sqlite > tbl1 tbl2 sqlite > 

"列表模式下表"命令类似于设置然后执行以下查询:

SELECT 名称FROM sqlite_master WHERE IN 类型('able '',  ''view ")AND NOT LIKE '��qlite_% "UNION ALL SELECT 名称FROM sqlite_temp_master WHERE IN 类型('able '',  ''view '' )ORDER BY 1

实际上, 如果您这样的源代码树sqlite3 程序(在列表中找到文件src/shellc )您将发现完全符合上面的查询

"用于分隔索引的工作方式类似"命令来列出所有索引的表中"用于分隔索引"命令接受一个参数, 它是该名称表的索引不正确last, 但不能有, 为"架构"命令不带参数, 则"架构"命令显示原始CREATE TABLE 和CREATE INDEX 语句被用来生成当前的数据库如果允许用户名称"架构", 它展示了在原始CREATE 语句用于将该表和全部如果它的索引我们有:

sqlite > 架构create table tbl1(one varchar(10) , 两个smallint )CREATE TABLE tbl2 (f1 varchar(30 )主键, f2 文本.f3 实数)sqlite > 架构tbl2 CREATE TABLE tbl2 (f1 varchar(30 )主键, f2 文本.f3 实数)sqlite > 

"架构"命令完成设置效果相同的列表模式, 则输入以下查询:

SELECT sql FROM (SELECT *FROM sqlite_master UNION ALL SELECT *FROM sqlite_temp_master )WHERE type!= ''meta "ORDER BY tbl_name , 请输入DESC,  名

或者, 如果您给出的参数"架构", 因为您只想要为单个表架构, 该查询是这个样子:

SELECT sql FROM (SELECT *FROM sqlite_master UNION ALL SELECT *FROM sqlite_temp_master )WHERE type!= ''meta "AND sql NOT NULL AND 名称NOT LIKE '��qlite_% "ORDER BY substr(type, 2, 1) , 名称

您可以提供一个参数bcp命令如果您, 查询是这个样子:

SELECT sql FROM (SELECT *FROM sqlite_master UNION ALL SELECT *FROM sqlite_temp_master )WHERE tbl_name LIKE ''%s "AND type!= ''meta "AND sql NOT NULL AND 名称NOT LIKE '��qlite_% "ORDER BY substr(type, 2, 1) , 名称

在查询中的"%s "被替换参数这允许您查看模式对于某些子集的数据库

sqlite > 架构%abc% 

沿着这些同样的, 而"表"命令也接受一个模式作为其第一个参数如果您给出参数设为表格命令, 一个"% "追加和instr 与LIKE 子句添加到查询这允许您仅列出这些表, 以匹配特定样式

"databases "命令显示了所有在当前连接打开的数据库总是至少有2第一个为"main ", 则原始数据库中打开第二个是"temp ", 该数据库用于临时表可能还有其他数据库中列出的数据库附加使用ATTACH 语句第一个输出列是附加到的名称, 第二个列是外部文件的文件名

sqlite > 数据库

将整个数据库转换为一个ASCII 文本的文件

使用"转储命令将整个数据库的内容复制到单个ASCII 文本文件该文件可以转换回数据库的管道其返回到sqlite3 .

请在存档复制一个很好的方式与此数据库:

$echo ''转储"| sqlite3 ex1 | gzip -c> ex1转储gz

这生成一个名为ex1转储gz包含createbackup 所需要的一切东西的数据库, 或另一个机器上createbackup数据库时, 只需输入:

$zcat ex1转储gz| sqlite3 ex2 

文字格式为纯SQL 因此, 您还可以使用转储命令将导出到在应用程序配置中设置的SQLite 数据库到其他常用的SQL 数据库引擎像这样:

$数据库集群ex2 $sqlite3 ex1转储| psql ex2 

其他点命令

"解释"点可以使用下面的命令将输出模式设置为"column "并设置列宽设置为合理的每个值都在一个EXPLAIN 命令的输出EXPLAIN命令是一个SQLite-specific SQL 扩展插件后台模式如果任何常规SQL scs 的EXPLAIN, 然后键入SQL 命令被解析, 但不执行虚拟机指令序列的条件时, 将已被用于执行SQL 命令返回查询结果, 如下所示: 例如:

sqlite > 解释sqlite > 解释tbl1 删除, 其中两个< 20 ;addr opcode p1 p2 p3 ---- ------------ ----- ----- ------------------------------------- 0ListOpen 001打开01tbl1 2下一页0╟93〗字段014整数20 05ge 026键007ListWrite 008goto 029noop 0010 ListRewind 0011 ListRead 014 12 删除0013 goto 011 14 ListClose 00

"超时"命令设定的时间sqlite3 程序将等待对文件的锁定来清除它正试图访问一个错误返回之前将超时的默认值零, 以便立即返回一个错误如果任何所需的数据库表或索引已被锁定

最后, 我们提及"退出"命令导致sqlite3 程序退出

使用sqlite3 在shell 脚本

使用sqlite3 在shell 脚本的一种方法是使用"echo "或""cat "来生成一个文件中的一系列命令然后调用的单元测试将从生成的命令文件的输入此依旧无法正常运行的是大多数情况下但作为附加的方便, sqlite3 允许单个SQL 命令在命令行输入的值为第二个参数在数据库的名称当启动sqlite3 程序时, 使用两个参数第二个参数将被传递到SQLite 库为处理在标准输出上打印查询的结果在列表中.模式和这种机制是专为帮助sqlite3 易于使用的程序, 如"awk "结合使用例如:

$sqlite3 ex1 '��elect *从tbl1 "| >  awk '{printf " < tr > < td > %s < td > %sn",$1,$2 }'< tr > < td > hello < td > 10 < tr > < td > 再见< td > 20 $

结束shell 命令

SQLite 命令通常由分号终止在shell 也可以使用word "GO "(不区分大小写), 也可以是一个斜杠字符"/ "变得杂乱结束命令以下是由SQL server 和oracle , 值定义这些无法工作sqlite3_exec( )通过shell , 因为这些转换为一个分号传递到该功能之前

将sqlite3 编译程序从源

源代码到命令行sqlite3 接口中的单个名为"shell可以确定c"下载从SQLite 网站首先编译此文件(一起使用sqlite3 库源代码生成可执行文件例如:

gcc -osqlite3 shellc sqlite3c -ldl -lpthread 

0 0