SQLite命令行外壳

2021-02-17 18:33:26

SQLite项目提供了一个名为sqlite3(或Windows上的sqlite3.exe)的简单命令行程序,该程序允许用户针对SQLite数据库或ZIP存档手动输入并执行SQL语句。本文档简要介绍了如何使用sqlite3程序。

通过键入" sqlite3"启动sqlite3程序。在命令提示符下,还可以选择在其后跟名称来保存SQLite数据库(或ZIP存档)的文件。如果namedfile不存在,将自动创建一个具有给定名称的新数据库文件。如果在命令行上未指定数据库文件,则将创建一个临时数据库,然后在" sqlite3"中删除该数据库。程序退出。

在启动时,sqlite3程序将显示简短的标题消息,然后提示您输入SQL。输入SQL语句(以分号终止),然后按" Enter" SQL将被执行。

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

$ sqlite3 ex1SQLite版本3.28.0 2019-03-02 15:25:24输入" .help"用法提示。sqlite>创建表tbl1(一个varchar(10),两个smallint); sqlite>插入到tbl1值中(' hello!',10); sqlite>将值插入tbl1值中('再见' 20); sqlite>从tbl1;中选择*;您好!| 10再见| 20sqlite>

通过键入systemEnd-Of-File字符(通常是Control-D)来终止sqlite3程序。使用中断字符(通常是Control-C)来停止长时间运行的SQL语句。

确保在每个SQL命令的末尾键入一个分号。sqlite3程序会寻找一个分号来知道您的SQL命令何时完成。如果省略分号,sqlite3会提示您继续操作,并等待您输入更多要添加到当前SQL命令中的文本。此功能使您可以输入跨越多行的SQL命令。例如:

sqlite>创建表tbl2(...> f1 varchar(30)主键,...> f2文本,...> f3实数...>); sqlite>

Windows用户可以双击sqlite3.exe图标,使命令行外壳弹出运行SQLite的终端窗口。但是,由于双击启动了不带命令行参数的sqlite3.exe,将没有指定数据库文件,因此SQLite将使用在会话退出时删除的临时数据库。要使用永久磁盘文件作为数据库,请输入" .open"在终端窗口启动后立即发出命令:

SQLite版本3.28.0 2019-03-02 15:25:24输入" .help"有关使用提示。已连接到临时内存数据库。使用" .open FILENAME"在持久数据库上重新打开。 .open ex1.dbsqlite>

上面的示例导致名为" ex1.db"的数据库文件。打开和使用。 " ex1.db"如果以前不存在该文件,则将创建该文件。您可能希望使用完整路径名来确保该文件位于该文件所在的目录中。使用正斜杠作为目录分隔符。换句话说,请使用"。 c:/work/ex1.db" ;,而不是" c:\ work \ ex1.db"。

或者,您可以使用默认的临时存储创建一个新数据库,然后使用" .save"将其保存到磁盘文件中。命令:

SQLite版本3.28.0 2019-03-02 15:25:24输入" .help"有关使用提示。已连接到临时内存数据库。使用" .open FILENAME"在持久数据库上重新打开。 ...省略了许多SQL命令... sqlite> .save ex1.dbsqlite>

使用" .save"时要小心。命令,因为它将覆盖所有先前存在的具有相同名称的数据库文件,而不会提示您进行确认。与" .open"一样命令,您可能希望使用带有正斜杠目录分隔符的完整路径名,以避免产生歧义。

在大多数情况下,sqlite3只是读取输入行并将其传递给SQLite库以执行,但是sqlite3程序本身会截取并解释以点("。")开头的输入行。这些&dot命令"通常用于更改查询的输出格式或执行某些预打包的查询语句。最初只有几个点命令,但是多年来积累了许多新功能,因此今天已有60多个。

有关可用的点命令的列表,可以输入" .help"。没有参数。或输入&#34..help主题"有关TOPIC的详细信息。可用的点命令列表如下:

sqlite> .help.archive ...管理SQL archives.auth ON | OFF显示授权者callbacks.backup?DB? FILE备份数据库(默认为" main")到FILE.bail on | off遇到错误后停止。默认值OFF.binary on | off打开或关闭二进制输出。默认值OFF.cd目录将工作目录更改为DIRECTORY。changeson | off显示由SQL更改的行数。检查GLOB如果由于.testcase不匹配而输出,则失败。复制NEWDB将现有数据库中的数据复制到NEWDB中。数据库列表名称和附加的数据库文件。dbconfig?op? val列出或更改sqlite3_db_config()options.dbinfo?DB?显示有关database.dump的状态信息?TABLE?将数据库内容呈现为SQL.echo on | off打开或关闭命令echo.eqp on | off | full | ...启用或禁用自动EXPLAIN QUERY PLAN.excel在电子表格中显示下一个命令的输出。使用返回码CODE.expert EXPERIMENTAL退出此程序。建议查询索引。解释?on | off | auto?更改EXPLAIN格式的模式。默认值:auto.filectrl CMD ...运行各种sqlite3_file_control()操作。fullschema?-indent?显示sqlite_stat表的模式和内容。headers on | off打开或关闭标题的显示。帮助吗? ?图案?显示PATTERN.import文件表的帮助文本。将数据从FILE导入TABLE.imposter INDEX表。在索引INDEX.indexes上创建冒名表TABLE吗?显示indexs.limit?LIMIT?的名称VAL显示或更改SQLITE_LIMIT.lint的值选项报告潜在的模式问题。加载扩展库。log FILE | off打开或关闭日志记录。文件可以是stderr / stdout.mode MODE吗?设置输出模式。nullvalueSTRING使用STRING代替NULL值。 ?文件?仅将下一个SQL命令的输出输出到FILE.open?OPTIONS? ?文件?关闭现有数据库,然后重新打开FILE.output?FILE?将输出发送到FILE或stdout(如果省略FILE)。参数CMD ...管理SQL参数绑定.print STRING ...打印文字STRING.progress N每N个操作码后调用进度处理程序一次。提示MAIN CONTINUE替换标准提示。退出此程序。读取文件从文件读取输入。恢复从损坏的数据库中恢复尽可能多的数据。 FILE从FILE.save恢复数据库的内容(默认为" main")。保存FILE将内存数据库写入FILE.scanstats on | off打开或关闭sqlite3_stmt_scanstatus()指标。显示与PATTERN.selftest?OPTIONS?相匹配的CREATE语句运行SELFTEST表中定义的测试。更改列分隔符和行分隔符。sha3sum ...计算数据库内容的SHA3哈希值。shell CMD ARGS ...在系统shell中运行CMD ARGS...。show显示各种设置的当前值。 ?显示统计信息或打开或关闭统计信息。系统CMD ARGS ...在系统shell中运行CMD ARGS ... tables?TABLE?列出与LIKE模式TABLE.testcase NAME匹配的表的名称。开始将输出重定向到' testcase-out.txt' .testctrl CMD ...运行各种sqlite3_test_control()操作。timeout MS尝试打开锁定的表,以MS毫秒为单位。 timer on | off打开或关闭SQL计时器。在运行时输出每个SQL语句。vfsinfo?AUX?有关顶级VFS.vfslist的信息列出所有可用的VFSes.vfsname?AUX?打印VFS堆栈的名称。width NUM1 NUM2 ...为列式输出设置最小列宽。

普通的SQL语句是自由格式的,可​​以分布在多行中,并且可以在任何地方具有空格和注释。点命令更具限制性:

点命令必须以"。"开头。在左边缘没有前面的空格。

点命令不能出现在普通SQL语句的中间。换句话说,点命令不能在连续提示处出现。

点命令由sqlite3.exe命令行程序解释,而不由SQLite本身解释。因此,没有任何点命令都可以用作sqlite3_prepare()或sqlite3_exec()之类的SQLite接口的参数。

sqlite3程序能够以14种不同格式显示查询结果:

您可以使用" .mode" dot命令可在这些输出格式之间切换。默认输出模式为" list"。在Inlist模式下,查询结果的每一行都写在输出的一行上,并且该行中的每一列都由特定的分隔符字符串分隔。默认的分隔符是管道符号(" |")。当您要将查询的输出发送到另一个程序(例如AWK)进行其他处理时,列表模式特别有用。

使用" .separator" dot命令更改分隔符。例如,要将分隔符更改为逗号和空格,可以执行以下操作:

下一个" .mode"命令将重置" .separator"还原为默认值。因此,您需要重复" .separator"如果要继续使用非标准分隔符,请在更改模式时使用命令。

在“ quote”中模式下,输出格式为SQL文字。字符串用单引号引起来,内部单引号通过加倍转义.Blob以十六进制Blob文字表示法显示(例如:x' abcd')。数字以ASCII文本显示,NULL值显示为& #34; NULL"。所有列都以逗号分隔(或使用" .separator"选择的任何替代字符)。

在"行"模式下,数据库行中的每一列都单独显示在一行上。每行由列名,等号和列数据组成。连续的记录用空白行分隔。这是线路模式输出的示例:

sqlite> .mode linesqlite>选择* from tbl1;一个= hellotwo = 10one =再见两个= 20sqlite>

在列模式下,每条记录显示在单独的行中,数据按列对齐。例如:

在"列中模式(以及在" box"," table"和" markdown"模式下),列的宽度会自动调整。但是您可以覆盖此设置,并使用" .width"为每列提供最小宽度" .width"的参数是整数,是分配给每一列的最小空间。负数表示右对齐。

宽度为0表示自动选择了列宽,未指定的列宽为零。因此,命令" .width"不带任何参数的情况下,将所有列宽设置为零,然后自动确定所有列宽。

"列"模式是表格输出格式。其他表格输出格式是" box&#34 ;、" markdown"和" table&#34 ;:

sqlite> .widthsqlite> .mode markdownsqlite>选择*从tbl1; |一|两个|| --------- | ----- ||你好! | 10 ||再见20 | sqlite> .mode tablesqlite>从tbl1中选择*; + --------- + ----- + |一|两个| + --------- + ----- + |你好! | 10 ||再见20 | + --------- + ----- + sqlite> .mode boxsqlite>从tbl1中选择*;┌────────┬┬──────┐│一个│两个│├─────────┼─────┤│你好! │10││再见│20│└───────┴┴──────┘sqlite>

另一个有用的输出模式是"插入"。在插入模式下,将输出格式化为类似于SQL INSERT语句的格式。使用insertmode生成文本,以后可以将其用于将数据输入到另一个数据库中。

当指定插入模式时,您必须提供一个额外的参数,该参数是要插入的表的名称。例如:

其他输出模式包括" html&#34 ;、" json"和" tcl"。自己尝试看看他们在做什么。

sqlite3程序提供了一些方便的命令,这些命令对于查看数据库的模式很有用。这些命令确实无法通过其他方式完成。这些命令纯粹是作为快捷方式提供的。

例如,要查看数据库中表的列表,可以输入" .tables"。

从sqlite_schema中选择名称,在其中输入IN(' table',' view')并且名称不喜欢&sql; sqlite _%' ORDER BY 1

但是" .tables"命令执行的更多。它查询sqlite_schema表中的所有附加数据库,而不仅仅是主数据库。并将其输出排列到整齐的列中。

" .indexes"命令以类似的方式列出所有索引。如果" .indexes"给该命令一个参数,该参数是表的名称,然后仅显示该表上的索引。

" .schema"该命令显示数据库或单个表(如果提供了可选的tablename参数)的完整模式:

sqlite> .schemacreate table tbl1(一个varchar(10),两个smallint)创建表tbl2(f1 varchar(30)主键,f2文本,f3实数) .schema tbl2CREATE TABLE tbl2(f1 varchar(30)主键,f2文本,f3实型)

" .schema"命令与设置列表模式大致相同,然后输入以下查询:

与" .tables"一样," .schema"命令显示所有附加数据库的架构。如果您只想查看单个数据库的架构(可能是" main"),则可以在" .schema"中添加一个参数。限制其输出:

" .schema"可以使用"-indent"扩展命令选项,在这种情况下,它将尝试重新格式化该模式的各种CREATE语句,以使人们更容易阅读它们。

&#34 ;.数据库"该命令显示当前连接中打开的所有数据库的列表。总会有至少2个。第一个是" main&#34 ;,原始数据库已打开。第二个是" temp&#34 ;,用于临时表的数据库。对于使用ATTACH语句附加的数据库,可能还会列出其他数据库。第一输出列是附加数据库的名称,第二结果列是外部文件的文件名。第三列结果可能是要么" r / o'或' r / w'"取决于数据库文件是只读文件还是读写文件。并且可能会有第四结果列显示该数据库文件的sqlite3_txn_state()结果。

" .fullschema"点命令的工作方式类似于" .schema"命令,它将显示整个数据库架构。但是" .fullschema"还包含统计信息表" sqlite_stat1&#34 ;、" sqlite_stat3"和" sqlite_stat4"的转储(如果存在)。 " .fullschema"该命令通常会提供针对特定查询完全重新创建查询计划所需的所有信息。向SQLite开发团队报告SQLite查询计划程序的可疑问题时,要求开发人员提供完整的" .fullschema"。输出作为故障报告的一部分。请注意,sqlite_stat3和sqlite_stat4表包含索引条目的样本,因此可能包含敏感数据,因此请不要发送" .fullschema"。通过公共通道输出专有数据库。

默认情况下,sqlite3将查询结果发送到标准输出。您可以使用" .output"进行更改和" .once"命令。只需将输出文件的名称作为.output的参数,所有后续查询结果将写入该文件。或者使用.once命令而不是.output,并且仅在重定向到控制台之前,将针对单个next命令重定向输出。使用不带参数的.output开始再次写入标准输出。例如:

如果" .output"的第一个字符或" .once" filename是管道符号(" |"),然后将其余字符视为命令,并将输出发送到该命令。这使得将查询结果传递到其他过程中变得很容易。例如," open -f"在Mac上,该命令会打开一个文本编辑器,以显示其从标准输入中读取的内容。因此,要在文本编辑器中查看查询的结果,可以输入:

如果" .output"或" .once"命令的参数为" -e"然后将输出收集到一个临时文件中,并在该文本文件上调用系统文本编辑器。因此,命令" .once -e"与" .open -f'"达到相同的结果但具有跨所有系统可移植的优势。

如果" .output"或" .once"命令具有" -x"参数,导致它们将输出作为逗号分隔值(CSV)累积在一个临时文件中,然后调用默认系统实用程序以查看结果上的CSV文件(通常是电子表格程序)。这是一种将查询结果发送到电子表格以便于查看的快速方法:

在交互模式下,sqlite3从键盘读取输入文本(SQL语句或点命令)。当然,当您启动sqlite3时,也可以从文件重定向输入,但是这样您就无法与该程序进行交互。有时,运行包含在文件中的SQL脚本很有用,该脚本从命令行输入其他命令。为此," .read"提供了点命令。

" .read"命令采用单个参数,该参数通常是从中读取输入文本的文件的名称。

" .read"命令暂时停止从键盘读取,而是从命名文件获取输入。到达文件末尾时,输入将返回到键盘。脚本文件可能包含点命令,就像普通的交互式输入一样。

如果参数为" .read"以" |"开头字符,然后而不是将参数作为文件打开,而是将参数(不带前导" |")作为命令运行,然后将该命令的输出用作其输入。因此,如果您具有生成SQL的脚本,则可以使用类似于以下命令的命令直接执行该SQL:

命令行外壳程序添加了两个应用程序定义的SQL函数,这些函数分别有助于从文件中读取内容到表列中以及将列中的内容写入文件中。

readfile(X)SQL函数读取名为X的文件的全部内容,并将该内容作为BLOB返回。这可用于将内容加载到表中。例如:

SQL函数writefile(X,Y)将Blob Y写入名为Xand的文件中,并返回写入的字节数。使用此功能可将单个表列的内容提取到文件中。例如:

请注意,readfile(X)和writefile(X,Y)函数是扩展函数,并且未内置在核心SQLite库中。这些例程在SQLite源代码存储库中的ext / misc / fileio.csource文件中作为可加载扩展名提供。

CLI具有另一个名为edit()的内置SQL函数。 Edit()需要一个或两个参数。第一个参数是一个值-通常是要编辑的大多行字符串。第二个参数是文本编辑器的名称。如果省略第二个参数,则使用VISUAL环境变量。 edit()函数将其第一个参数写入临时文件,在临时文件上调用编辑器,完成编辑器后将文件重新读回内存,然后返回已编辑的文本。

在此示例中,docs.name条目为" report-15"的docs.body字段的内容。将被发送到编辑器。编辑器返回后,结果将写回到docs.body字段中。

edit()的默认操作是调用文本编辑器。但是通过使用第二种替代编辑程序

......