SQLite 项目提供了一个名为 sqlite3(或 Windows 上的 sqlite3.exe)的简单命令行程序,允许用户手动输入和执行针对 SQLite 数据库或 ZIP 存档的 SQL 语句。本文档简要介绍了如何使用 sqlite3 程序。
通过在命令提示符下键入“sqlite3”来启动 sqlite3 程序,可以选择后面跟着包含 SQLite 数据库(或 ZIP 存档)的文件的名称。如果指定的文件不存在,则会自动创建一个具有给定名称的新数据库文件。如果命令行上未指定数据库文件,则会创建一个临时数据库,并在“sqlite3”程序退出时自动删除。
启动时,sqlite3 程序会显示一条简短的横幅消息,然后提示您输入 SQL。输入 SQL 语句(以分号结尾),按“Enter”键,SQL 将被执行。
例如,要创建一个名为“ex1”的新 SQLite 数据库,其中包含一个名为“tbl1”的表,您可以执行以下操作
$ sqlite3 ex1 SQLite version 3.36.0 2021-06-18 18:36:39 Enter ".help" for usage hints. sqlite> create table tbl1(one text, two int); sqlite> insert into tbl1 values('hello!',10); sqlite> insert into tbl1 values('goodbye', 20); sqlite> select * from tbl1; hello!|10 goodbye|20 sqlite>
通过键入系统文件结束符(通常为 Control-D)来终止 sqlite3 程序。使用中断字符(通常为 Control-C)停止长时间运行的 SQL 语句。
确保在每个 SQL 命令的末尾键入分号!sqlite3 程序会查找分号以了解您的 SQL 命令何时完成。如果您省略分号,sqlite3 将提供一个继续提示,并等待您输入更多文本以完成 SQL 命令。此功能允许您输入跨越多行的 SQL 命令。例如
sqlite> CREATE TABLE tbl2 ( ...> f1 varchar(30) primary key, ...> f2 text, ...> f3 real ...> ); sqlite>
Windows 用户可以双击 sqlite3.exe 图标,使命令行 shell 弹出一个运行 SQLite 的终端窗口。但是,由于双击启动 sqlite3.exe 不会带命令行参数,因此不会指定任何数据库文件,所以 SQLite 将使用一个在会话退出时删除的临时数据库。要使用持久磁盘文件作为数据库,请在终端窗口启动后立即输入“.open”命令
SQLite version 3.36.0 2021-06-18 18:36:39 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> .open ex1.db sqlite>
上面的示例导致名为“ex1.db”的数据库文件被打开并使用。“ex1.db”文件在之前不存在时会被创建。您可能需要使用完整路径名来确保文件位于您认为所在的目录中。使用正斜杠作为目录分隔符。换句话说,使用“c:/work/ex1.db”,而不是“c:\work\ex1.db”。
或者,您可以使用默认的临时存储创建新的数据库,然后使用“.save”命令将该数据库保存到磁盘文件
SQLite version 3.36.0 2021-06-18 18:36:39 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> ... many SQL commands omitted ... sqlite> .save ex1.db sqlite>
使用“.save”命令时要小心,因为它会覆盖任何具有相同名称的预先存在的数据库文件,而不会提示确认。与“.open”命令一样,您可能需要使用带有正斜杠目录分隔符的完整路径名来避免歧义。
大多数情况下,sqlite3 只读取输入行并将它们传递给 SQLite 库以执行。但以点(“.”)开头的输入行会被 sqlite3 程序本身拦截并解释。这些“点命令”通常用于更改查询的输出格式或执行某些预打包的查询语句。最初只有几个点命令,但多年来积累了许多新功能,因此今天有 60 多个。
要查看可用的点命令列表,您可以输入不带参数的“.help”。或输入“.help TOPIC”以获取有关 TOPIC 的详细信息。可用的点命令列表如下
sqlite> .help .archive ... Manage SQL archives .auth ON|OFF Show authorizer callbacks .backup ?DB? FILE Backup DB (default "main") to FILE .bail on|off Stop after hitting an error. Default OFF .cd DIRECTORY Change the working directory to DIRECTORY .changes on|off Show number of rows changed by SQL .check GLOB Fail if output since .testcase does not match .clone NEWDB Clone data into NEWDB from the existing database .connection [close] [#] Open or close an auxiliary database connection .crnl on|off Translate \n to \r\n. Default ON .databases List names and files of attached databases .dbconfig ?op? ?val? List or change sqlite3_db_config() options .dbinfo ?DB? Show status information about the database .dump ?OBJECTS? Render database content as SQL .echo on|off Turn command echo on or off .eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN .excel Display the output of next command in spreadsheet .exit ?CODE? Exit this program with return-code CODE .expert EXPERIMENTAL. Suggest indexes for queries .explain ?on|off|auto? Change the EXPLAIN formatting mode. Default: auto .filectrl CMD ... Run various sqlite3_file_control() operations .fullschema ?--indent? Show schema and the content of sqlite_stat tables .headers on|off Turn display of headers on or off .help ?-all? ?PATTERN? Show help text for PATTERN .import FILE TABLE Import data from FILE into TABLE .indexes ?TABLE? Show names of indexes .limit ?LIMIT? ?VAL? Display or change the value of an SQLITE_LIMIT .lint OPTIONS Report potential schema issues. .load FILE ?ENTRY? Load an extension library .log FILE|on|off Turn logging on or off. FILE can be stderr/stdout .mode MODE ?OPTIONS? Set output mode .nonce STRING Suspend safe mode for one command if nonce matches .nullvalue STRING Use STRING in place of NULL values .once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE .open ?OPTIONS? ?FILE? Close existing database and reopen FILE .output ?FILE? Send output to FILE or stdout if FILE is omitted .parameter CMD ... Manage SQL parameter bindings .print STRING... Print literal STRING .progress N Invoke progress handler after every N opcodes .prompt MAIN CONTINUE Replace the standard prompts .quit Stop interpreting input stream, exit if primary. .read FILE Read input from FILE or command output .recover Recover as much data as possible from corrupt db. .restore ?DB? FILE Restore content of DB (default "main") from FILE .save ?OPTIONS? FILE Write database to FILE (an alias for .backup ...) .scanstats on|off|est Turn sqlite3_stmt_scanstatus() metrics on or off .schema ?PATTERN? Show the CREATE statements matching PATTERN .separator COL ?ROW? Change the column and row separators .session ?NAME? CMD ... Create or control sessions .sha3sum ... Compute a SHA3 hash of database content .shell CMD ARGS... Run CMD ARGS... in a system shell .show Show the current values for various settings .stats ?ARG? Show stats or turn stats on or off .system CMD ARGS... Run CMD ARGS... in a system shell .tables ?TABLE? List names of tables matching LIKE pattern TABLE .timeout MS Try opening locked tables for MS milliseconds .timer on|off Turn SQL timer on or off .trace ?OPTIONS? Output each SQL statement as it is run .version Show source, library and compiler versions .vfsinfo ?AUX? Information about the top-level VFS .vfslist List all available VFSes .vfsname ?AUX? Print the name of the VFS stack .width NUM1 NUM2 ... Set minimum column widths for columnar output sqlite>
CLI 的输入被解析成一个序列,包括:
SQL 语句是自由格式的,可以跨越多行,在任何位置嵌入空格或 SQL 注释。它们以输入行末尾的分号“;”字符或单独一行上的“/”字符或“go”一词作为结尾。当不在输入行末尾时,“;”字符用于分隔 SQL 语句。出于终止目的,忽略尾随空格。
点命令具有更严格的结构:
CLI 还接受以“#”字符开头并扩展到行尾的整行注释。在“#”之前不能有空格。
传递给点命令的参数根据以下规则从命令尾部解析:
点命令由 sqlite3.exe 命令行程序解释,而不是由 SQLite 本身解释。因此,任何点命令都不能作为 SQLite 接口(例如 sqlite3_prepare() 或 sqlite3_exec())的参数。
sqlite3 程序能够以 14 种不同的输出格式显示查询结果:
您可以使用“.mode”点命令在这些输出格式之间切换。默认输出模式为“list”。在列表模式下,查询结果的每一行都写入输出的一行,并且该行中的每个列都由特定的分隔符字符串分隔。默认分隔符是管道符号(“|”)。当您要将查询的输出发送到另一个程序(例如 AWK)以进行进一步处理时,列表模式特别有用。
sqlite> .mode list sqlite> select * from tbl1; hello!|10 goodbye|20 sqlite>
键入不带参数的“.mode”以显示当前模式
sqlite> .mode current output mode: list sqlite>
使用“.separator”点命令更改分隔符。例如,要将分隔符更改为逗号和空格,您可以执行以下操作:
sqlite> .separator ", " sqlite> select * from tbl1; hello!, 10 goodbye, 20 sqlite>
下一个“.mode”命令可能会将“.separator”重置回某个默认值(取决于其参数)。因此,如果您想继续使用非标准分隔符,则可能需要在每次更改模式时重复“.separator”命令。
在“quote”模式下,输出格式化为 SQL 文字。字符串用单引号括起来,内部单引号通过加倍进行转义。Blob 以十六进制 Blob 文字表示法显示(例如:x'abcd')。数字以 ASCII 文本显示,NULL 值显示为“NULL”。所有列都由逗号(或使用“.separator”选择的任何其他字符)彼此分隔。
sqlite> .mode quote sqlite> select * from tbl1; 'hello!',10 'goodbye',20 sqlite>
在“line”模式下,数据库中每一行中的每一列都单独显示在一行上。每一行都包含列名、等号和列数据。连续的记录由空行分隔。以下是一个行模式输出的示例:
sqlite> .mode line sqlite> select * from tbl1; one = hello! two = 10 one = goodbye two = 20 sqlite>
在列模式下,每个记录都显示在单独的一行上,数据在列中对齐。例如:
sqlite> .mode column sqlite> select * from tbl1; one two -------- --- hello! 10 goodbye 20 sqlite>
在“column”模式(以及“box”、“table”和“markdown”模式)中,列的宽度会自动调整。但是您可以覆盖此功能,使用“.width”命令为每个列提供指定的宽度。“.width”的参数是整数,表示分配给每个列的字符数。负数表示右对齐。因此:
sqlite> .width 12 -6 sqlite> select * from tbl1; one two ------------ ------ hello! 10 goodbye 20 sqlite>
宽度为 0 表示列宽自动选择。未指定的列宽变为零。因此,不带参数的“.width”命令会将所有列宽重置为零,从而导致所有列宽都自动确定。
“column”模式是一种表格输出格式。其他表格输出格式为“box”、“markdown”和“table”。
sqlite> .width sqlite> .mode markdown sqlite> select * from tbl1; | one | two | |---------|-----| | hello! | 10 | | goodbye | 20 | sqlite> .mode table sqlite> select * from tbl1; +---------+-----+ | one | two | +---------+-----+ | hello! | 10 | | goodbye | 20 | +---------+-----+ sqlite> .mode box sqlite> select * from tbl1; ┌─────────┬─────┐ │ one │ two │ ├─────────┼─────┤ │ hello! │ 10 │ │ goodbye │ 20 │ └─────────┴─────┘ sqlite>
列模式接受一些其他选项来控制格式。"--wrap N" 选项(其中 N 是一个整数)会导致列换行长度超过 N 个字符的文本。如果 N 为零,则禁用换行。
sqlite> insert into tbl1 values('The quick fox jumps over a lazy brown dog.',90); sqlite> .mode box --wrap 30 sqlite> select * from tbl1 where two>50; ┌────────────────────────────────┬─────┐ │ one │ two │ ├────────────────────────────────┼─────┤ │ The quick fox jumps over a laz │ 90 │ │ y brown dog. │ │ └────────────────────────────────┴─────┘ sqlite>
换行发生在恰好 N 个字符之后,这可能在单词的中间。要在单词边界换行,请添加“--wordwrap on”选项(或简写为“-ww”)
sqlite> .mode box --wrap 30 -ww sqlite> select * from tbl1 where two>50; ┌─────────────────────────────┬─────┐ │ one │ two │ ├─────────────────────────────┼─────┤ │ The quick fox jumps over a │ 90 │ │ lazy brown dog. │ │ └─────────────────────────────┴─────┘ sqlite>
“--quote”选项会导致每一列中的结果像 SQL 文字一样加引号,就像在“quote”模式中一样。有关其他选项,请参阅联机帮助。
命令“.mode box --wrap 60 --quote”对于通用数据库查询非常有用,因此它有自己的别名。无需键入整个 27 个字符的命令,您只需说“.mode qbox”即可。
另一种有用的输出模式是“insert”。在插入模式下,输出格式化为类似 SQL INSERT 语句。使用插入模式生成稍后可用于将数据输入到不同数据库的文本。
指定插入模式时,您必须提供一个额外的参数,即要插入到的表的名称。例如:
sqlite> .mode insert new_table sqlite> select * from tbl1 where two<50; INSERT INTO "new_table" VALUES('hello',10); INSERT INTO "new_table" VALUES('goodbye',20); sqlite>
其他输出模式包括“csv”、“json”和“tcl”。自己尝试一下,看看它们的功能。
sqlite3 程序提供了一些方便的命令,可用于查看数据库的模式。这些命令所做的事情,可以用其他方法做到。这些命令纯粹是为了提供快捷方式。
例如,要查看数据库中所有表的列表,可以输入“.tables”。
sqlite> .tables tbl1 tbl2 sqlite>
“.tables”命令类似于设置列表模式,然后执行以下查询
SELECT name FROM sqlite_schema WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%' ORDER BY 1
但“.tables”命令的功能更多。它查询sqlite_schema表中所有附加的数据库,而不仅仅是主数据库。并且它将其输出排列成整齐的列。
“.indexes”命令的工作方式类似,用于列出所有索引。如果“.indexes”命令给定一个参数,该参数是表的名称,则它只显示该表上的索引。
“.schema”命令显示数据库的完整模式,或者如果提供了可选的表名参数,则显示单个表的模式
sqlite> .schema create table tbl1(one varchar(10), two smallint) CREATE TABLE tbl2 ( f1 varchar(30) primary key, f2 text, f3 real ); sqlite> .schema tbl2 CREATE TABLE tbl2 ( f1 varchar(30) primary key, f2 text, f3 real ); sqlite>
“.schema”命令大致相当于设置列表模式,然后输入以下查询
SELECT sql FROM sqlite_schema ORDER BY tbl_name, type DESC, name
与“.tables”一样,“.schema”命令显示所有附加的数据库的模式。如果您只想查看单个数据库(可能是“main”)的模式,则可以向“.schema”添加一个参数来限制其输出
sqlite> .schema main.*
“.schema”命令可以使用“--indent”选项进行增强,在这种情况下,它会尝试重新格式化模式的各种 CREATE 语句,以便人类更容易阅读。
“.databases”命令显示当前连接中所有打开的数据库列表。至少会有两个。第一个是“main”,即最初打开的数据库。第二个是“temp”,用于临时表的数据库。对于使用 ATTACH 语句附加的数据库,可能还会列出其他数据库。第一个输出列是数据库附加的名称,第二个结果列是外部文件的名称。可能还有一个第三个结果列,它将是“'r/o'”或“'r/w'”,具体取决于数据库文件是只读还是读写。并且可能还有一个第四个结果列,显示sqlite3_txn_state()对该数据库文件的返回值。
sqlite> .databases
“.fullschema”点命令的工作方式类似于“.schema”命令,它显示整个数据库模式。但“.fullschema”还包括统计表“sqlite_stat1”、“sqlite_stat3”和“sqlite_stat4”(如果存在)的转储。“.fullschema”命令通常提供完全重建特定查询的查询计划所需的所有信息。当向 SQLite 开发团队报告疑似与 SQLite 查询规划器相关的问题时,开发人员需要提供完整的“.fullschema”输出作为故障报告的一部分。请注意,sqlite_stat3 和 sqlite_stat4 表包含索引条目的样本,因此可能包含敏感数据,因此请勿通过公共渠道发送专有数据库的“.fullschema”输出。
“.open”命令打开一个新的数据库连接,并在首先关闭先前打开的数据库命令后执行此操作。在最简单的形式中,“.open”命令只是在名为其参数的文件上调用sqlite3_open()。使用名称“:memory:”打开一个新的内存数据库,该数据库在 CLI 退出或再次运行“.open”命令时消失。或者不使用名称打开一个私有的、临时的磁盘数据库,该数据库也会在退出或使用“.open”时消失。
如果“.open”包含“--new”选项,则在打开数据库之前会重置数据库。任何先前的数据都会被销毁。这会破坏性地覆盖先前的数据,并且不会请求确认,因此请谨慎使用此选项。
“--readonly”选项以只读模式打开数据库。将禁止写入。
“--deserialize”选项导致将磁盘文件的整个内容读取到内存中,然后使用sqlite3_deserialize()接口将其作为内存数据库打开。当然,如果您有大型数据库,这将需要大量内存。此外,除非您使用“.save”或“.backup”命令显式保存更改,否则您对数据库所做的任何更改都不会保存回磁盘。
“--append”选项导致 SQLite 数据库附加到现有文件,而不是作为独立文件工作。有关更多信息,请参阅appendvfs 扩展。
“--zip”选项导致将指定的输入文件解释为 ZIP 存档,而不是作为 SQLite 数据库文件。
“--hexdb”选项导致数据库内容从后续输入行的十六进制格式中读取,而不是从磁盘上的单独文件中读取。“dbtotxt”命令行工具可用于生成数据库的相应文本。“--hexdb”选项旨在供 SQLite 开发人员用于测试目的。我们不知道此选项在 SQLite 内部测试和开发之外的任何用例。
默认情况下,sqlite3 将查询结果发送到标准输出。您可以使用“.output”和“.once”命令更改此设置。只需将输出文件的名称作为“.output”的参数,所有后续查询结果都将写入该文件。或者使用“.once”命令代替“.output”,输出将仅在下一个命令重定向,然后恢复到控制台。使用不带参数的“.output”开始再次写入标准输出。例如
sqlite> .mode list sqlite> .separator | sqlite> .output test_file_1.txt sqlite> select * from tbl1; sqlite> .exit $ cat test_file_1.txt hello|10 goodbye|20 $
如果“.output”或“.once”文件名第一个字符是管道符号(“|”),则其余字符将被视为命令,并且输出将发送到该命令。这使得将查询结果管道传输到其他进程变得容易。例如,Mac 上的“open -f”命令打开一个文本编辑器以显示它从标准输入读取的内容。因此,要在文本编辑器中查看查询结果,可以键入
sqlite> .once | open -f sqlite> SELECT * FROM bigTable;
如果“.output”或“.once”命令的参数为“-e”,则输出将收集到一个临时文件中,并且系统文本编辑器将在该文本文件上调用。因此,命令“.once -e”与“.once '|open -f'”的效果相同,但具有跨所有系统可移植的优点。
如果“.output”或“.once”命令具有“-x”参数,则它们会导致它们将输出作为逗号分隔值 (CSV) 累积到一个临时文件中,然后在结果上调用用于查看 CSV 文件的默认系统实用程序(通常是电子表格程序)。这是一种将查询结果快速发送到电子表格以方便查看的方法
sqlite> .once -x sqlite> SELECT * FROM bigTable;
“.excel”命令是“.once -x”的别名。它执行完全相同的事情。
在交互模式下,sqlite3 从键盘读取输入文本(SQL 语句或点命令)。当然,您也可以在启动 sqlite3 时从文件重定向输入,但这意味着您将无法与程序交互。有时,在从命令行输入其他命令时,运行文件中包含的 SQL 脚本非常有用。为此,提供了“.read”点命令。
“.read”命令接受一个参数,该参数(通常)是从中读取输入文本的文件的名称。
sqlite> .read myscript.sql
“.read”命令暂时停止从键盘读取,而是从指定的文件中获取输入。到达文件末尾时,输入将恢复到键盘。脚本文件可以包含点命令,就像普通的交互式输入一样。
如果“.read”的参数以“|”字符开头,则它不会将参数作为文件打开,而是运行参数(不带前面的“|”)作为命令,然后使用该命令的输出作为其输入。因此,如果您有一个生成 SQL 的脚本,您可以使用类似于以下的命令直接执行该 SQL
sqlite> .read |myscript.bat
命令行 shell 添加了两个应用程序定义的 SQL 函数,它们分别促进将文件内容读取到表列中以及将列内容写入文件。
readfile(X) SQL 函数读取名为 X 的文件的整个内容,并将其内容作为 BLOB 返回。这可以用于将内容加载到表中。例如
sqlite> CREATE TABLE images(name TEXT, type TEXT, img BLOB); sqlite> INSERT INTO images(name,type,img) ...> VALUES('icon','jpeg',readfile('icon.jpg'));
writefile(X,Y) SQL 函数将 blob Y 写入名为 X 的文件中,并返回写入的字节数。使用此函数将单个表列的内容提取到文件中。例如
sqlite> SELECT writefile('icon.jpg',img) FROM images WHERE name='icon';
请注意,readfile(X) 和 writefile(X,Y) 函数是扩展函数,未内置于核心 SQLite 库中。这些例程作为可加载扩展在ext/misc/fileio.c源文件中可用,该源文件位于SQLite 源代码存储库中。
CLI 还有另一个名为 edit() 的内置 SQL 函数。Edit() 接受一个或两个参数。第一个参数是一个值——通常是一个需要编辑的大型多行字符串。第二个参数是文本编辑器的调用。(它可能包含影响编辑器行为的选项。)如果省略第二个参数,则使用 VISUAL 环境变量。edit() 函数将其第一个参数写入一个临时文件,在临时文件上调用编辑器,在编辑器完成后将文件重新读取回内存,然后返回已编辑的文本。
edit() 函数可用于对大型文本值进行更改。例如
sqlite> UPDATE docs SET body=edit(body) WHERE name='report-15';
在此示例中,将发送 docs.name 为“report-15”的条目的 docs.body 字段的内容到编辑器。编辑器返回后,结果将写回 docs.body 字段。
edit() 的默认操作是调用文本编辑器。但是,通过在第二个参数中使用替代编辑程序,您也可以使其编辑图像或其他非文本资源。例如,如果您想修改存储在表字段中的 JPEG 图像,您可以运行
sqlite> UPDATE pics SET img=edit(img,'gimp') WHERE id='pic-1542';
编辑程序也可以用作查看器,只需忽略返回值即可。例如,要仅查看上面的图像,您可以运行
sqlite> SELECT length(edit(img,'gimp')) WHERE id='pic-1542';
使用“.import”命令将 CSV(逗号分隔值)或类似分隔符的数据导入 SQLite 表中。“.import”命令接受两个参数,分别是读取数据的源和要将数据插入的 SQLite 表的名称。源参数是要读取的文件的名称,或者如果它以“|”字符开头,则它指定一个将运行以生成输入数据的命令。
请注意,在运行“.import”命令之前设置“mode”可能很重要。这样做是为了防止命令行 shell 尝试将输入文件文本解释为除文件结构以外的其他格式。如果使用“--csv”或“--ascii”选项,则它们控制导入输入分隔符。否则,分隔符是当前输出模式下有效的那些分隔符。
要导入到“main”模式之外的表中,可以使用“--schema”选项指定表位于其他模式中。这对于附加的数据库或导入到 TEMP 表中很有用。
运行“.import”时,它对第一行输入的处理取决于目标表是否已存在。如果不存在,则会自动创建表,并且第一行输入的内容用于设置表中所有列的名称。在这种情况下,表数据内容取自第二行及后续的输入行。如果目标表已存在,则输入的每一行(包括第一行)都将被视为实际的数据内容。如果输入文件包含一列列标签的初始行,则可以使用“--skip 1”选项使“.import”命令跳过该初始行。
这是一个示例用法,从一个 CSV 文件加载一个预先存在的临时表,该文件的第一行包含列名。
sqlite> .import --csv --skip 1 --schema temp C:/work/somedata.csv tab1
在以除“ascii”以外的模式读取输入数据时,“.import”会根据 RFC 4180 规范将输入解释为由字段组成的记录,但有一个例外:输入记录和字段分隔符由模式或使用 .separator 命令设置。字段始终需要进行引号移除以撤销根据 RFC 4180 完成的引号添加,但在 ascii 模式下除外。
要导入具有任意分隔符且没有引号的数据,首先设置 ascii 模式(“.mode ascii”),然后使用 .separator 命令设置字段和记录分隔符。这将抑制去引号。在“.import”时,数据将根据如此指定的定界符拆分为字段和记录。
要将 SQLite 表(或表的一部分)导出为 CSV,只需将“mode”设置为“csv”,然后运行查询以提取表中所需的行。输出将根据 RFC 4180 格式化为 CSV。
sqlite> .headers on sqlite> .mode csv sqlite> .once c:/work/dataout.csv sqlite> SELECT * FROM tab1; sqlite> .system c:/work/dataout.csv
在上面的示例中,“.headers on”行导致列标签作为输出的第一行打印。这意味着生成的 CSV 文件的第一行将包含列标签。如果不需要列标签,请改为设置“.headers off”。(“.headers off”设置是默认设置,如果之前没有启用标题,则可以省略。)
“.once FILENAME”行导致所有查询输出都进入指定的文件,而不是打印到控制台。在上面的示例中,该行导致 CSV 内容写入名为“C:/work/dataout.csv”的文件中。
示例的最后一行(“.system c:/work/dataout.csv”)与在 Windows 中双击 c:/work/dataout.csv 文件的效果相同。这通常会打开一个电子表格程序来显示 CSV 文件。
该命令仅在 Windows 上按原样工作。在 Mac 上等效的行是
sqlite> .system open dataout.csv
在 Linux 和其他 Unix 系统上,您需要输入类似以下内容
sqlite> .system xdg-open dataout.csv
为了简化导出到电子表格,CLI 提供了“.excel”命令,该命令捕获单个查询的输出并将该输出发送到主机计算机上的默认电子表格程序。使用方法如下
sqlite> .excel sqlite> SELECT * FROM tab;
上面的命令将查询的输出作为 CSV 写入临时文件,调用 CSV 文件的默认处理程序(通常是首选的电子表格程序,如 Excel 或 LibreOffice),然后删除临时文件。这本质上是执行上面描述的“.csv”、“.once”和“.system”命令序列的简写方法。
“.excel”命令实际上是“.once -x”的别名。.once 的 -x 选项导致它将结果作为 CSV 写入一个以“.csv”为后缀的临时文件,然后调用系统 CSV 文件的默认处理程序。
还有一个“.once -e”命令,其工作方式类似,只是它将临时文件命名为“.txt”后缀,以便调用系统的默认文本编辑器,而不是默认电子表格。
可以通过在运行查询之前输入“.mode tabs”来导出到纯 TSV,没有任何字段引用。但是,如果输出包含双引号字符,则“.import”命令在制表符模式下将无法正确读取输出。要获取根据 RFC 4180 引用过的 TSV,以便可以使用“.import”在制表符模式下输入,首先输入“.mode csv”,然后在运行查询之前输入'.separator "\t"'。
除了读取和写入 SQLite 数据库文件外,sqlite3 程序还将读取和写入 ZIP 档案。只需在初始命令行或“.open”命令中指定 ZIP 档案文件名代替 SQLite 数据库文件名,sqlite3 将自动检测该文件是 ZIP 档案而不是 SQLite 数据库,并将其打开。这适用于任何文件后缀。因此,您可以打开 JAR、DOCX 和 ODP 文件以及任何其他实际上是 ZIP 档案的文件格式,SQLite 将为您读取它。
ZIP 档案似乎是一个数据库,其中包含一个具有以下架构的表
CREATE TABLE zip( name, // Name of the file mode, // Unix-style file permissions mtime, // Timestamp, seconds since 1970 sz, // File size after decompression rawdata, // Raw compressed file data data, // Uncompressed file content method // ZIP compression method code );
因此,例如,如果您想查看所有 ZIP 档案中所有文件的压缩效率(表示为压缩内容的大小相对于原始未压缩文件大小),并按压缩程度从高到低排序,您可以运行以下查询
sqlite> SELECT name, (100.0*length(rawdata))/sz FROM zip ORDER BY 2;
或者使用文件 I/O 函数,您可以提取 ZIP 档案的元素
sqlite> SELECT writefile(name,content) FROM zip ...> WHERE name LIKE 'docProps/%';
命令行 shell 使用Zipfile 虚拟表来访问 ZIP 档案。您可以通过在打开 ZIP 档案时运行“.schema”命令来查看这一点
sqlite> .schema CREATE VIRTUAL TABLE zip USING zipfile('document.docx') /* zip(name,mode,mtime,sz,rawdata,data,method) */;
打开文件时,如果命令行客户端发现该文件是 ZIP 档案而不是 SQLite 数据库,它实际上会打开一个内存数据库,然后在该内存数据库中创建一个Zipfile 虚拟表的实例,该实例附加到 ZIP 档案。
打开 ZIP 档案的特殊处理是命令行 shell 的技巧,而不是 SQLite 核心库的技巧。因此,如果您想在应用程序中将 ZIP 档案作为数据库打开,则需要激活Zipfile 虚拟表模块,然后运行适当的CREATE VIRTUAL TABLE语句。
使用“.dump”命令将数据库的全部内容转换为单个 UTF-8 文本文件。可以通过将其回传到sqlite3中将此文件转换回数据库。
制作数据库存档副本的一个好方法是:
$ sqlite3 ex1 .dump | gzip -c >ex1.dump.gz
这将生成一个名为ex1.dump.gz的文件,其中包含您以后或在另一台机器上重建数据库所需的所有内容。要重建数据库,只需键入
$ zcat ex1.dump.gz | sqlite3 ex2
文本格式是纯 SQL,因此您还可以使用 .dump 命令将 SQLite 数据库导出到其他流行的 SQL 数据库引擎。像这样
$ createdb ex2 $ sqlite3 ex1 .dump | psql ex2
与“.dump”命令类似,“.recover”尝试将数据库文件的全部内容转换为文本。不同之处在于,“.recover”不是使用正常的 SQL 数据库接口读取数据,而是尝试根据从尽可能多的数据库页面直接提取的数据重新组装数据库。如果数据库已损坏,“.recover”通常能够恢复数据库所有未损坏部分的数据,而“.dump”在遇到第一个损坏迹象时就会停止。
如果“.recover”命令恢复了一行或多行,但无法将其归因于任何数据库表,则输出脚本将创建一个“lost_and_found”表来存储孤立的行。lost_and_found 表的模式如下
CREATE TABLE lost_and_found( rootpgno INTEGER, -- root page of tree pgno is a part of pgno INTEGER, -- page number row was found on nfield INTEGER, -- number of fields in row id INTEGER, -- value of rowid field, or NULL c0, c1, c2, c3... -- columns for fields of row );
“lost_and_found”表为从数据库恢复的每个孤立行包含一行。此外,对于每个无法归因于任何 SQL 索引的恢复索引条目,也有一行。这是因为,在 SQLite 数据库中,使用相同的格式来存储 SQL 索引条目和 WITHOUT ROWID 表条目。
列 | 内容 |
---|---|
rootpgno | 即使可能无法将行归因于特定的数据库表,它也可能是数据库文件中树结构的一部分。在这种情况下,该树结构的根页面号存储在此列中。或者,如果找到行的页面不是树结构的一部分,则此列存储列“pgno”的值的副本——找到行的页面的页面号。在许多(尽管不是所有)情况下,lost_and_found 表中在此列中具有相同值的的所有行都属于同一表。 |
pgno | 找到此行的页面的页面号。 |
nfield | 此行中的字段数。 |
id | 如果行来自 WITHOUT ROWID 表,则此列包含 NULL。否则,它包含行的 64 位整数 rowid 值。 |
c0, c1, c2... | 每列的值都存储在这些列中。“.recover”命令创建的 lost_and_found 表具有最长的孤立行所需的列数。 |
如果恢复的数据库模式已经包含一个名为“lost_and_found”的表,则“.recover”命令将使用名称“lost_and_found0”。如果名称“lost_and_found0”也被占用,则使用“lost_and_found1”,依此类推。默认名称“lost_and_found”可以通过使用 --lost-and-found 开关调用“.recover”来覆盖。例如,要使输出脚本将表称为“orphaned_rows”
sqlite> .recover --lost-and-found orphaned_rows
您可以使用“.load”命令在运行时将新的自定义应用程序定义的 SQL 函数、排序规则、虚拟表和VFS添加到命令行 shell。首先,将扩展构建为 DLL 或共享库(如运行时可加载扩展文档中所述),然后键入
sqlite> .load /path/to/my_extension
请注意,SQLite 会自动将适当的扩展后缀(Windows 上为“.dll”,Mac 上为“.dylib”,大多数其他 Unix 上为“.so”)添加到扩展文件名。通常最好指定扩展的完整路径名。
SQLite 根据扩展文件名计算扩展的入口点。要覆盖此选择,只需将扩展的名称作为第二个参数添加到“.load”命令。
几个有用扩展的源代码可以在 SQLite 源代码树的ext/misc子目录中找到。您可以按原样使用这些扩展,或者作为创建自己的自定义扩展的基础,以满足您自己的特定需求。
“.sha3sum”点命令计算数据库内容的SHA3哈希。需要明确的是,哈希是在数据库内容上计算的,而不是其在磁盘上的表示形式。这意味着,例如,VACUUM或类似的数据保留转换不会更改哈希。
“.sha3sum”命令支持选项“--sha3-224”、“--sha3-256”、“--sha3-384”和“--sha3-512”来定义用于哈希的 SHA3 的哪种变体。默认值为 SHA3-256。
数据库模式(在sqlite_schema表中)通常不包含在哈希中,但可以通过“--schema”选项添加。
“.sha3sum”命令接受一个可选参数,该参数是一个LIKE模式。如果存在此选项,则只有名称与LIKE模式匹配的表才会被哈希。
“.sha3sum”命令是在扩展函数“sha3_query()”的帮助下实现的,该函数包含在命令行 shell 中。
“.selftest”命令尝试验证数据库是否完整且未损坏。.selftest 命令查找架构中名为“selftest”且定义如下表的表
CREATE TABLE selftest( tno INTEGER PRIMARY KEY, -- Test number op TEXT, -- 'run' or 'memo' cmd TEXT, -- SQL command to run, or text of "memo" ans TEXT -- Expected result of the SQL command );
。selftest 命令按 selftest.tno 顺序读取 selftest 表的行。对于每个“memo”行,它将“cmd”中的文本写入输出。对于每个“run”行,它将“cmd”文本作为 SQL 运行并将结果与“ans”中的值进行比较,如果结果不同,则显示错误消息。
如果没有 selftest 表,则“.selftest”命令运行PRAGMA integrity_check。
".selftest --init" 命令会在 selftest 表不存在的情况下创建它,然后追加条目以检查所有表的內容的 SHA3 哈希值。随后运行 ".selftest" 将验证数据库是否以任何方式更改。要生成测试以验证一部分表未更改,只需运行 ".selftest --init",然后DELETE 引用非恒定表的 selftest 行。
".archive" 点命令和 "-A" 命令行选项提供了对SQLite 归档格式的内置支持。该接口类似于 unix 系统上的 "tar" 命令。每次调用 ".ar" 命令都必须指定一个命令选项。以下命令可用于 ".archive"
选项 | 长选项 | 用途 |
---|---|---|
-c | --create | 创建一个包含指定文件的新的归档文件。 |
-x | --extract | 从归档文件中提取指定的文件。 |
-i | --insert | 将文件添加到现有归档文件中。 |
-r | --remove | 从归档文件中删除文件。 |
-t | --list | 列出归档文件中的文件。 |
-u | --update | 将文件添加到现有归档文件中,如果它们已更改。 |
除了命令选项外,每次调用 ".ar" 都可以指定一个或多个修饰符选项。一些修饰符选项需要参数,一些不需要。以下修饰符选项可用
选项 | 长选项 | 用途 |
---|---|---|
-v | --verbose | 在处理每个文件时列出它。 |
-f FILE | --file FILE | 如果指定,则使用文件 FILE 作为归档文件。否则,假设当前的 "main" 数据库是要操作的归档文件。 |
-a FILE | --append FILE | 与 --file 类似,使用文件 FILE 作为归档文件,但使用apndvfs VFS打开文件,以便如果 FILE 已存在,则将归档文件追加到 FILE 的末尾。 |
-C DIR | --directory DIR | 如果指定,则将所有相对路径解释为相对于 DIR,而不是当前工作目录。 |
-g | --glob | 使用glob(Y,X) 将参数与归档文件中的名称进行匹配。 |
-n | --dryrun | 显示将运行以执行归档操作的 SQL 语句,但实际上不更改任何内容。 |
-- | -- | 所有后续命令行单词都是命令参数,而不是选项。 |
对于命令行用法,在 "-A" 后面立即添加简写风格的命令行选项,中间没有空格。所有后续参数都被视为 .archive 命令的一部分。例如,以下命令是等效的
sqlite3 new_archive.db -Acv file1 file2 file3 sqlite3 new_archive.db ".ar -cv file1 file2 file3"
可以混合使用长选项和短选项。例如,以下命令是等效的
-- Two ways to create a new archive named "new_archive.db" containing -- files "file1", "file2" and "file3". .ar -c --file new_archive.db file1 file2 file3 .ar -f new_archive.db --create file1 file2 file3
或者,".ar" 后面的第一个参数可以是所有必需选项的简写形式的串联(不带 "-" 字符)。在这种情况下,需要参数的选项的参数从命令行中读取,任何剩余的单词都被视为命令参数。例如
-- Create a new archive "new_archive.db" containing files "file1" and -- "file2" from directory "dir1". .ar cCf dir1 new_archive.db file1 file2 file3
创建一个新的归档文件,覆盖任何现有的归档文件(在当前的 "main" 数据库中或由 --file 选项指定的文件中)。选项后面的每个参数都是要添加到归档文件中的文件。目录被递归导入。有关示例,请参见上文。
从归档文件中提取文件(到当前工作目录或由 --directory 选项指定的目录)。名称与参数匹配的文件或目录(受 --glob 选项影响)将被提取。或者,如果没有参数跟随选项,则提取所有文件和目录。任何指定的目录都被递归提取。如果任何指定的名称或匹配模式在归档文件中找不到,则会发生错误。
-- Extract all files from the archive in the current "main" db to the -- current working directory. List files as they are extracted. .ar --extract --verbose -- Extract file "file1" from archive "ar.db" to directory "dir1". .ar fCx ar.db dir1 file1 -- Extract files with ".h" extension to directory "headers". .ar -gCx headers *.h
列出归档文件的内容。如果没有指定参数,则列出所有文件。否则,仅列出与参数匹配的文件(受 --glob 选项影响)。目前,--verbose 选项不会更改此命令的行为。这将来可能会改变。
-- List contents of archive in current "main" db.. .ar --list
--update 和 --insert 命令的工作方式与 --create 命令类似,只是它们在开始之前不会删除当前归档文件。新版本的文档会静默地替换具有相同名称的现有文档,但在其他方面,归档文件(如果有)的初始内容保持不变。
对于 --insert 命令,列出的所有文件都将插入到归档文件中。对于 --update 命令,仅当文件以前不存在于归档文件中,或者其 "mtime" 或 "mode" 与当前归档文件中的不同时,才会插入文件。
兼容性说明:在 SQLite 3.28.0(2019-04-16)版本之前,仅支持 --update 选项,但该选项的工作方式类似于 --insert,因为它始终重新插入每个文件,无论它是否已更改。
--remove 命令删除与提供的参数(如果有)匹配的文件和目录(受 --glob 选项影响)。提供与归档文件中没有任何内容匹配的参数是错误的。
如果 FILE 是 ZIP 归档文件而不是 SQLite 归档文件,则 ".archive" 命令和 "-A" 命令行选项仍然有效。这是通过使用zipfile 扩展实现的。因此,以下命令大致等效,仅在输出格式方面有所不同
传统命令 | 等效的 sqlite3.exe 命令 |
---|---|
unzip archive.zip | sqlite3 -Axf archive.zip |
unzip -l archive.zip | sqlite3 -Atvf archive.zip |
zip -r archive2.zip dir | sqlite3 -Acf archive2.zip dir |
各种 SQLite 归档命令是使用 SQL 语句实现的。应用程序开发人员可以通过运行相应的 SQL,轻松地将其自己的项目中添加 SQLite 归档读取和写入支持。
要查看用于实现 SQLite 归档操作的 SQL 语句,请添加 --dryrun 或 -n 选项。这会导致显示 SQL,但会阻止 SQL 的执行。
用于实现 SQLite 归档操作的 SQL 语句利用了各种可加载扩展。这些扩展都可以在SQLite 源代码树的ext/misc/ 子文件夹中找到。完全支持 SQLite 归档所需的扩展包括
fileio.c — 此扩展添加了 SQL 函数 readfile() 和 writefile(),用于读取和写入磁盘上文件的內容。fileio.c 扩展还包括用于列出目录內容的 fsdir() 表值函数,以及用于将 stat() 系统调用的数字 st_mode 整数转换为类似于 "ls -l" 命令的人类可读字符串的 lsmode() 函数。
sqlar.c — 此扩展添加了 sqlar_compress() 和 sqlar_uncompress() 函数,这些函数是压缩和解压缩文件內容所必需的,因为它被插入和提取自 SQLite 归档文件。
zipfile.c — 此扩展实现了 "zipfile(FILE)" 表值函数,该函数用于读取 ZIP 归档文件。仅当读取 ZIP 归档文件而不是 SQLite 归档文件时,才需要此扩展。
appendvfs.c — 此扩展实现了一个新的VFS,它允许将 SQLite 数据库追加到某些其他文件,例如可执行文件。仅当使用 .archive 命令的 --append 选项时,才需要此扩展。
SQLite 允许绑定参数出现在 SQL 语句中任何允许使用文字值的地方。这些参数的值使用sqlite3_bind_...() 系列 API 设置。
参数可以是命名的,也可以是未命名的。未命名参数是一个问号 ("?")。命名参数是问号 ("?") 后面紧跟一个数字(例如:"?15" 或 "?123")或 "$"、":" 或 "@" 中的一个字符,后面跟一个字母数字名称(例如:"$var1"、":xyz"、"@bingo")。
此命令行 shell 将未命名参数保持未绑定状态,这意味着它们的值将为 SQL NULL,但命名参数可能会分配值。如果存在名为 "sqlite_parameters" 的 TEMP 表,其架构如下所示
CREATE TEMP TABLE sqlite_parameters( key TEXT PRIMARY KEY, value ) WITHOUT ROWID;
如果该表中存在一个条目,其中键列完全匹配参数的名称(包括初始的 "?"、"$"、":" 或 "@" 字符),则将参数分配为值列的值。如果不存在条目,则参数默认为 NULL。
".parameter" 命令用于简化此表的管理。".parameter init" 命令(通常缩写为 ".param init")会在 temp.sqlite_parameters 表不存在的情况下创建它。".param list" 命令显示 temp.sqlite_parameters 表中的所有条目。".param clear" 命令删除 temp.sqlite_parameters 表。".param set KEY VALUE" 和 ".param unset KEY" 命令创建或删除 temp.sqlite_parameters 表中的条目。
传递给 ".param set KEY VALUE" 的 VALUE 可以是 SQL 文字,也可以是任何其他 SQL 表达式或查询,这些表达式或查询可以计算出值。这允许设置不同类型的值。如果此类计算失败,则提供的 VALUE 将被引用并作为文本插入。因为这种初始计算可能会因 VALUE 内容而成功或失败,所以获取文本值的可靠方法是用单引号括起来,以防止上述命令尾部解析。例如,(除非您打算使用 -1365 的值)
.parameter init .parameter set @phoneNumber "'202-456-1111'"
请注意,双引号用于保护单引号并确保引用的文本被解析为一个参数。
temp.sqlite_parameters 表仅为命令行 shell 中的参数提供值。temp.sqlite_parameter 表对使用 SQLite C 语言 API 直接运行的查询没有影响。各个应用程序预计将实现自己的参数绑定。您可以在命令行 shell 源代码中搜索 "sqlite_parameters",了解命令行 shell 如何执行参数绑定,并将其用作如何自己实现它的提示。
注意:此命令是实验性的。将来某个时候可能会删除它或以不兼容的方式修改其接口。
对于大多数非平凡的 SQL 数据库,性能的关键是创建正确的 SQL 索引。在这种情况下,“正确的 SQL 索引”是指那些导致应用程序需要优化的查询快速运行的索引。".expert" 命令可以通过建议可能有助于特定查询的索引来协助此操作,如果这些索引存在于数据库中。
首先发出 ".expert" 命令,然后在单独的行上输入 SQL 查询。例如,考虑以下会话
sqlite> CREATE TABLE x1(a, b, c); -- Create table in database sqlite> .expert sqlite> SELECT * FROM x1 WHERE a=? AND b>?; -- Analyze this SELECT CREATE INDEX x1_idx_000123a7 ON x1(a, b); 0|0|0|SEARCH TABLE x1 USING INDEX x1_idx_000123a7 (a=? AND b>?) sqlite> CREATE INDEX x1ab ON x1(a, b); -- Create the recommended index sqlite> .expert sqlite> SELECT * FROM x1 WHERE a=? AND b>?; -- Re-analyze the same SELECT (no new indexes) 0|0|0|SEARCH TABLE x1 USING INDEX x1ab (a=? AND b>?)
在上述示例中,用户创建数据库模式(一个表 - "x1"),然后使用 ".expert" 命令分析查询,在本例中为 "SELECT * FROM x1 WHERE a=? AND b>?"。shell 工具建议用户创建一个新索引(索引 "x1_idx_000123a7")并输出查询将在EXPLAIN QUERY PLAN 格式中使用的计划。然后,用户创建了一个具有等效模式的索引,并再次对同一查询运行分析。这次,shell 工具不会推荐任何新索引,并输出 SQLite 将针对给定现有索引的查询使用的计划。
".expert" 命令接受以下选项
选项 | 用途 |
---|---|
‑‑verbose | 如果存在,则为分析的每个查询输出更详细的报告。 |
‑‑sample PERCENT | 此参数默认为 0,导致 ".expert" 命令仅根据查询和数据库模式推荐索引。这类似于SQLite 查询计划程序在用户未对数据库运行ANALYZE 命令以生成数据分布统计信息的情况下为查询选择索引的方式。
如果此选项传递了一个非零参数,则“.expert”命令会根据每个数据库表中当前存储的行数的PERCENT百分比,为所有考虑的索引生成类似的数据分布统计信息。对于数据分布异常的数据库,这可能会导致更好的索引建议,尤其是在应用程序打算运行ANALYZE的情况下。 对于小型数据库和现代CPU,通常没有理由不传递“--sample 100”。但是,收集数据分布统计信息对于大型数据库表来说可能代价很高。如果操作太慢,请尝试为--sample选项传递较小的值。 |
本节中描述的功能可以使用SQLite expert扩展代码集成到其他应用程序或工具中。
包含通过扩展加载机制提供的SQL自定义函数的数据库模式可能需要特殊配置才能与.expert功能一起使用。由于该功能使用额外的连接来实现其功能,因此必须使这些自定义函数可用于这些额外的连接。这可以通过自动加载静态链接扩展和持久加载扩展中描述的扩展加载/使用选项来实现。
从3.37.0版(2021-11-27)开始,CLI能够同时保持多个数据库连接处于打开状态。一次只能激活一个数据库连接。未激活的连接仍然处于打开状态,但处于空闲状态。
使用“.connection”点命令(通常缩写为“.conn”)查看数据库连接列表以及当前激活的连接指示。每个数据库连接都由0到9之间的整数标识。(最多可以同时打开10个连接。)通过键入“.conn”命令后跟其编号,切换到另一个数据库连接,如果该连接尚不存在则创建它。通过键入“.conn close N”(其中N是连接编号)关闭数据库连接。
尽管底层的SQLite数据库连接彼此完全独立,但许多CLI设置(例如输出格式)在所有数据库连接之间共享。因此,在一个连接中更改输出模式将更改所有连接中的模式。另一方面,一些点命令(如.open)仅影响当前连接。
CLI是使用几个未包含在SQLite库中的SQLite扩展构建的。一些添加了前面部分中未描述的功能,即
命令行shell中还有许多其他点命令可用。请参阅“.help”命令以获取特定SQLite版本和构建的完整列表。
在shell脚本中使用sqlite3的一种方法是使用“echo”或“cat”生成文件中的命令序列,然后在从生成的命令文件重定向输入时调用sqlite3。这可以正常工作,并且在许多情况下都是合适的。但为了方便起见,sqlite3允许在命令行上将单个SQL命令作为第二个参数输入到数据库名称之后。当sqlite3程序以两个参数启动时,第二个参数将传递给SQLite库进行处理,查询结果将以列表模式打印到标准输出,并且程序退出。此机制旨在使sqlite3易于与“awk”等程序结合使用。例如
$ sqlite3 ex1 'select * from tbl1' \ > | awk '{printf "<tr><td>%s<td>%s\n",$1,$2 }' <tr><td>hello<td>10 <tr><td>goodbye<td>20 $
SQLite命令通常以分号结尾。在CLI中,您也可以使用单词“GO”(不区分大小写)或单独一行上的斜杠字符“/”来结束命令。这些分别由SQL Server和Oracle使用,并由SQLite CLI为了兼容性而支持。这些在sqlite3_exec()中不起作用,因为CLI在将这些输入传递到SQLite核心之前会将其转换为分号。
CLI提供了许多命令行选项。使用--help命令行选项查看列表
$ sqlite3 --help Usage: ./sqlite3 [OPTIONS] FILENAME [SQL] FILENAME is the name of an SQLite database. A new database is created if the file does not previously exist. Defaults to :memory:. OPTIONS include: -- treat no subsequent arguments as options -A ARGS... run ".archive ARGS" and exit -append append the database to the end of the file -ascii set output mode to 'ascii' -bail stop after hitting an error -batch force batch I/O -box set output mode to 'box' -column set output mode to 'column' -cmd COMMAND run "COMMAND" before reading stdin -csv set output mode to 'csv' -deserialize open the database using sqlite3_deserialize() -echo print inputs before execution -init FILENAME read/process named file -[no]header turn headers on or off -help show this message -html set output mode to HTML -interactive force interactive I/O -json set output mode to 'json' -line set output mode to 'line' -list set output mode to 'list' -lookaside SIZE N use N entries of SZ bytes for lookaside memory -markdown set output mode to 'markdown' -maxsize N maximum size for a --deserialize database -memtrace trace all memory allocations and deallocations -mmap N default mmap size set to N -newline SEP set output row separator. Default: '\n' -nofollow refuse to open symbolic links to database files -nonce STRING set the safe-mode escape nonce -nullvalue TEXT set text string for NULL values. Default '' -pagecache SIZE N use N slots of SZ bytes each for page cache memory -pcachetrace trace all page cache operations -quote set output mode to 'quote' -readonly open the database read-only -safe enable safe-mode -separator SEP set output column separator. Default: '|' -stats print memory stats before each finalize -table set output mode to 'table' -tabs set output mode to 'tabs' -unsafe-testing allow unsafe commands and modes for testing -version show SQLite version -vfs NAME use NAME as the default VFS -zip open the file as a ZIP Archive
CLI在命令行选项格式方面很灵活。允许使用一个或两个前导“-”字符。因此,“-box”和“--box”含义相同。命令行选项从左到右处理。因此,“--box”选项将覆盖之前的“--quote”选项。
--safe命令行选项尝试禁用CLI的所有可能导致对主机计算机进行任何更改(除了对命令行上指定的特定数据库文件进行更改)的功能。其想法是,如果您从未知或不可信来源收到大型SQL脚本,则可以使用--safe选项运行该脚本以查看其作用,而无需冒被利用的风险。--safe选项禁用(除其他事项外)
基本上,CLI中任何从磁盘上的文件(除了主数据库文件)读取或写入的功能都将被禁用。
如果命令行上还包含“--nonce NONCE”选项,对于某个大型且任意的NONCE字符串,则“.nonce NONCE”命令(使用相同的nonce字符串)将允许下一个SQL语句或点命令绕过--safe限制。
假设您想运行可疑脚本,并且该脚本需要--safe通常禁用的一个或两个功能。例如,假设它需要附加一个额外的数据库。或者假设脚本需要加载特定的扩展。这可以通过在(经过仔细审核的)ATTACH语句或“.load”命令之前添加适当的“.nonce”命令并使用“--nonce”命令行选项提供相同的nonce值来实现。然后将允许这些特定命令正常执行,但所有其他不安全的命令仍将受到限制。
使用“.nonce”很危险,因为错误可能会允许恶意脚本损坏您的系统。因此,请谨慎、适度地使用“.nonce”,并在没有其他方法可以在--safe模式下运行脚本时将其作为最后手段。
--unsafe-testing命令行选项启用仅用于内部测试的CLI功能。--unsafe-testing选项禁用内置于SQLite中的防御措施。例如,禁用的防御措施包括SQLITE_DBCONFIG_DEFENSIVE和SQLITE_DBCONFIG_TRUSTED_SCHEMA。--unsafe-testing选项还启用某些功能,如果使用不当,可能会导致CLI本身或SQLite库中的数据库损坏、内存错误或类似问题。--unsafe-testing启用的功能示例包括.imposter点命令和SQLITE_TESTCTRL_ASSERT。
需要使用--unsafe-testing选项的错误行为通常不会被视为错误。
在Windows平台上,当控制台用于输入或输出时,需要在控制台提供的或发送到控制台的字符编码与CLI的内部UTF-8文本表示之间进行转换。过去的CLI版本接受这些选项以启用或禁用依赖于Windows控制台功能的转换,该功能可以通过该功能使其在现代版本的OS上产生或接受UTF-8。
当前的CLI版本(3.44.1或更高版本)通过从/向Windows控制台API读取或写入UTF-16来执行控制台I/O。由于这即使在Windows 2000及更高版本的Windows上也能正确运行,因此不再需要这些选项。它们仍然被接受,但没有效果。
在所有情况下,非控制台文本I/O均为UTF-8编码。
在非Windows平台上,这些选项也会被忽略。
要在unix系统和使用MinGW的Windows上编译命令行shell,通常的configure-make命令有效
sh configure; make
无论您是从源代码树中的规范源代码构建,还是从合并的包构建,configure-make都有效。依赖项很少。从规范源代码构建时,需要一个可用的tclsh。如果使用合并的包,tclsh通常执行的所有预处理工作都将已完成,并且只需要普通的构建工具。
为了使.archive命令能够运行,需要一个可用的zlib压缩库。
在使用MSVC的Windows上,使用nmake和Makefile.msc
nmake /f Makefile.msc
为了使.archive命令能够正确运行,请将zlib源代码的副本复制到源代码树的compat/zlib子目录中,并以此方式进行编译
nmake /f Makefile.msc USE_ZLIB=1
sqlite3命令行界面的源代码位于名为“shell.c”的单个文件中。“shell.c”源文件是从其他源文件生成的,但“shell.c”的大部分代码可以在src/shell.c.in中找到。(通过从规范源代码树中键入“make shell.c”重新生成shell.c。)编译shell.c文件(以及sqlite3库源代码)以生成可执行文件。例如
gcc -o sqlite3 shell.c sqlite3.c -ldl -lpthread -lz -lm
为了提供功能齐全的命令行shell,建议使用以下其他编译时选项
此页面上次修改于2024-07-17 19:02:28 UTC