如何列出使用ATTACH打开的SQLite数据库文件中的表?


1197

SQLite 3命令行工具中将其附加到命令后,可以使用哪种SQL列出表以及这些表中的行在SQLite数据库文件中?ATTACH


1
试试这个,您
可以获得

2
如果您感兴趣的话,以下是sqlite的有用GUI:sqlitestudio.pl使您可以快速查看数据库,表的详细信息,并且还具有不错的查询编辑器...
James Oravec 2013年

17
.tables用于表和.schema ?TABLE?特定表的模式。
H6。

.table 'bank_%'.table '%_empl'用于查询前缀/后缀的有效语法!
Givenkoa 2015年

Answers:


576

.tables.schema“辅助”功能不考虑附加的数据库:他们只是查询SQLITE_MASTER表“主”数据库。因此,如果您使用

ATTACH some_file.db AS my_db;

那你需要做

SELECT name FROM my_db.sqlite_master WHERE type='table';

请注意,临时表都不会显示.tables:您必须为此列出sqlite_temp_master

SELECT name FROM sqlite_temp_master WHERE type='table';

121
"SELECT name FROM sqlite_master WHERE type='table'"对我
有用

3
从my_db.sqlite_master中选择名称,其中type ='table'; 这对我来说不起作用(对于附加的数据库),它会引发错误,例如:不存在这样的表“ my_db.sqlite_master”
kanika

临时表是什么意思?我刚打开SQLite db文件时有什么?
Ewoks

临时表是使用CREATE TEMPORARY TABLESQL命令创建的表。当当前数据库连接关闭时,它们的内容将被删除,并且它们永远不会保存到数据库文件中。
安东尼·威廉姆斯

1
在sqlite3命令模式下运行并运行ATTACH "some_file.db" AS my_db;
John_J

1272

有一些步骤可以查看SQLite数据库中的表:

  1. 列出数据库中的表:

    .tables
  2. 列出表格的外观:

    .schema tablename
  3. 打印整个表:

    SELECT * FROM tablename;
  4. 列出所有可用的SQLite提示命令:

    .help

45
.table并且.tables都被允许。对于这个问题,.ta将工作为好,因为sqlite3的接受是明确的任何命令。根据帮助的命令名称的确是“ .tables”(如果有人还在注意的话)。
dbn

29
(这应该是公认的答案,这是最明智的处理方式)。
dbn

6
.tables如果一个打开的数据库通过,则不会显示表,ATTACH '<path>' AS <name>;但是lasse的答案会显示。既然OP提到了ATTACHing,我相信他不接受这个答案是正确的。编辑:只是注意到下面的安东尼和其他人也指出了这一点。
antiplex

2
@dbw:不一定。考虑您正在做一个能够使用SQLite或MySql的数据库包装器(我的情况)。如果您使用DB供应商特定的命令,那么使用更多符合SQL的命令将使移植其他语言的包装变得更加容易。
Valentin Heinitz

“ ... sqlite3将接受任何明确的命令...”不幸的是,有时它也接受不明确的命令。例如,即使也可以使用“ .schema”,“。separator”或“ .stats”,“。s”也将解释为“ .show”,并且当它不接受模棱两可的命令时,未列出的可能性。

442

看来您需要浏览sqlite_master表,如下所示:

SELECT * FROM dbname.sqlite_master WHERE type='table';

然后使用SELECT或类似符号手动浏览每个表以查看行。

.DUMP.SCHEMA命令不会出现看到数据库的。


120
将来不容易阅读或记住的东西;内置.tables命令更直观

24
@Gryllida:尽管可以在任何SQL-API中使用,因为它是有效的SQL。内置命令可能并非在所有地方都受支持。
Valentin Heinitz

2
@DoktorJ是否.tables已修改为显示来自附加数据库的表?
Lasse V. Karlsen 2013年

4
在该数据库中,是的,但是这个问题是关于在您已附加的数据库中显示表。是否.tables已修改命令以显示这些命令?
Lasse V. Karlsen

4
h!阅读理解失败...我以某种方式设法没抓住ATTACH参考...两次> _ <
Doktor J

162

要显示所有表格,请使用

SELECT name FROM sqlite_master WHERE type = "table"

要显示所有行,我想您可以遍历所有表,并对每个表执行SELECT *。但是也许您想要的是DUMP?


16
感谢您提供真正解决该问题的唯一答案...“什么SQL”,而不是可以使用什么命令...谢谢!
布莱德·帕克斯

同样,这每行打印一个表名,而.tables则打印多列表名(讨厌/无用)。
Shane 2014年

68

使用.help检查可用的命令。

.table

该命令将显示当前数据库下的所有表。


奇怪的,它必须是正确的,但不工作时,我使用它
于尔根K.

42

SQLite命令行上有一个可用的命令:

.tables ?PATTERN?      List names of tables matching a LIKE pattern

转换为以下SQL:

SELECT name FROM sqlite_master
WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
WHERE type IN ('table','view')
ORDER BY 1

36

要列出表,您还可以执行以下操作:

SELECT name FROM sqlite_master
WHERE type='table';

所以... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""")还是没有?这对我不起作用,但是我不确定该代码应在哪里运行。
jbuddy_13


24

我使用此查询来获取它:

SELECT name FROM sqlite_master WHERE type='table'

并在iOS中使用:

NSString *aStrQuery=[NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table'"];

16

根据文档,相当于MySQLs SHOW TABLES;是:

“ .tables”命令类似于设置列表模式,然后执行以下查询:

SELECT name FROM sqlite_master
  WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
  WHERE type IN ('table','view')
ORDER BY 1;

但是,如果要检查单个表是否存在(或获取其详细信息),请参见@LuizGeron答案。


15

从最新版本的SQLite 3开始,您可以发出:

.fullschema

查看所有的create语句。


SQLite版本3.7.13 2012-07-17 17:46:21输入“ .help”以获得说明输入以“;”结尾的SQL语句 sqlite> .fullschema错误:命令未知或参数无效:“ fullschema”。输入“ .help”寻求帮助
莫娜·贾拉勒

2
您正在使用的版本从2012年
辣椒

12

最简单的方法是直接打开数据库并使用.dump命令,而不是在调用SQLite 3 Shell工具后附加它。

因此...(假设您的OS命令行提示符为$),而不是$sqlite3

sqlite3> ATTACH database.sqlite as "attached"

在您的OS命令行中,直接打开数据库:

$sqlite3 database.sqlite
sqlite3> .dump

10

通过union all,将所有表合并为一个列表。

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'

9

采用:

import sqlite3

TABLE_LIST_QUERY = "SELECT * FROM sqlite_master where type='table'"

7

由于没有人提到SQLite的官方参考,因此我认为在此标题下引用它可能会很有用:

https://www.sqlite.org/cli.html

您可以使用此链接中描述的命令来操作数据库。此外,如果您使用的是Windows OS,但不知道命令外壳在哪里,则位于SQLite的站点中:

https://www.sqlite.org/download.html

下载后,单击sqlite3.exe文件初始化SQLite命令外壳程序。初始化后,默认情况下,此SQLite会话使用内存数据库,而不是磁盘上的文件,因此当会话退出时,所有更改都将丢失。要将永久磁盘文件用作数据库,请在终端窗口启动后立即输入“ .open ex1.db”命令。

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

要查看您先前选择的数据库中的所有表,请按上述链接中的命令键入.tables命令。

如果您使用Windows,我认为将此sqlite.exe文件与其他Python文件移动到同一文件夹可能会很有用。这样,Python文件将写入到同一目录中,而SQLite shell从.db文件中读取的则在同一路径中。


5

“ .schema”突击队将通过显示用于创建所述表的语句来列出可用表及其行:

sqlite>创建table_a(id int,a int,b int);
sqlite> .schema table_a
创建表table_a(id int,a int,b int);

1

.da查看所有数据库-一个称为“ main ”的数据库

该数据库的表可以通过

从sqlite_master命令中选择不同的tbl_name 1;

附加的数据库需要在语句ATTACH中使用AS选择的前缀,例如aa(,bb,cc ...),因此:

aa.sqlite_master命令中选择不同的tbl_name 1;

请注意,您在这里也可以看到视图。要排除这些,请 在“订单”之前添加 type =“ table”的地方

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.