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

izb*_*izb 1151 sql database sqlite metadata

什么SQL可用于列出表,以及SQLite数据库文件中这些表中的行 - 一旦我ATTACH在SQLite 3命令行工具上附加了命令?

小智 1253

在SQLite数据库中查看表有几个步骤:

  1. 列出数据库中的表:

    .tables
    
    Run Code Online (Sandbox Code Playgroud)
  2. 列出表格的外观:

    .schema tablename
    
    Run Code Online (Sandbox Code Playgroud)
  3. 打印整个表格:

    SELECT * FROM tablename;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 列出所有可用的SQLite提示命令:

    .help
    
    Run Code Online (Sandbox Code Playgroud)

  • `.table`和`.tables`都是允许的.就此而言,`.ta`也可以,因为sqlite3将接受任何明确的命令.根据帮助的命令名称确实是".表"(如果有人仍在关注). (45认同)
  • (这应该是公认的答案,它是最常用的做事方式). (29认同)
  • 如果通过`ATTACH'<path>'AS <name>打开数据库,`.tables`将不显示表;`但是lasse的答案就是这样.由于OP提到ATTACHing,我相信他不接受这个答案是正确的.编辑:刚才注意到安东尼和其他人也指出了这一点. (4认同)
  • @dbw:不一定。考虑您正在做一个能够使用SQLite或MySql的数据库包装器(我的情况)。如果您使用DB供应商特定的命令,则使用更多符合SQL的命令将使移植其他语言的包装更加容易。 (2认同)
  • 这个答案缺少上下文,所以没有帮助。 (2认同)

Ant*_*ams 552

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

ATTACH some_file.db AS my_db;
Run Code Online (Sandbox Code Playgroud)

那你需要做

SELECT name FROM my_db.sqlite_master WHERE type='table';
Run Code Online (Sandbox Code Playgroud)

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

SELECT name FROM sqlite_temp_master WHERE type='table';
Run Code Online (Sandbox Code Playgroud)

  • 只有`"SELECT name FROM sqlite_master WHERE type ='table'"`对我有用 (108认同)
  • SELECT name FROM my_db.sqlite_master WHERE type ='table'; 这对我(对于附加的数据库)不起作用,并且它会抛出错误:不存在这样的表"my_db.sqlite_master" (3认同)
  • 在 sqlite3 命令模式下运行`ATTACH "some_file.db" AS my_db;` 成功了! (2认同)

ang*_*son 439

看来你需要通过sqlite_master表,如下所示:

SELECT * FROM dbname.sqlite_master WHERE type='table';
Run Code Online (Sandbox Code Playgroud)

然后手动浏览每个表格SELECT或类似的表格来查看行.

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

  • 不容易阅读或记住将来使用的东西; 内置的`.tables`命令更直观 (120认同)
  • @Gryllida:尽管这可以从任何SQL-API中使用,因为它是valide SQL.可能无法随处支持内置命令. (24认同)
  • *在该数据库*中,是的,但这个问题是关于在您附加的数据库中显示表格.是否已修改`.tables`命令以显示这些命令? (4认同)
  • 卫生署!阅读理解失败......我不知道怎么设法找不到ATTACH参考......两次> _ < (4认同)
  • @DoktorJ是否已修改`.tables`以显示附加数据库中的表? (2认同)

Chr*_*vén 159

要显示所有表格,请使用

SELECT name FROM sqlite_master WHERE type = "table"
Run Code Online (Sandbox Code Playgroud)

为了显示所有行,我猜你可以遍历所有表,并在每个表上执行SELECT*.但也许DUMP就是您追求的目标?

  • 感谢真正解决问题的唯一答案......"什么SQL",而不是什么命令可以使用...谢谢! (16认同)

小智 68

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

.table
Run Code Online (Sandbox Code Playgroud)

此命令将显示当前数据库下的所有表.


小智 42

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

.tables ?PATTERN?      List names of tables matching a LIKE pattern
Run Code Online (Sandbox Code Playgroud)

哪个转换为以下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
Run Code Online (Sandbox Code Playgroud)


Raf*_*ird 36

要列出表格,您还可以:

SELECT name FROM sqlite_master
WHERE type='table';
Run Code Online (Sandbox Code Playgroud)


Lui*_*ron 30

请尝试PRAGMA table_info(table-name);
http://www.sqlite.org/pragma.html#schema

  • 这仅在您知道表的名称时才有效.您不能使用它来获取表名列表. (6认同)
  • 这可能是最好的方法。 (2认同)

Gam*_*ing 22

我使用此查询来获取它:

SELECT name FROM sqlite_master WHERE type='table'
Run Code Online (Sandbox Code Playgroud)

并在iOS中使用:

NSString *aStrQuery=[NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table'"];
Run Code Online (Sandbox Code Playgroud)


Ali*_*xel 16

根据文档,相当于MySQL的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;
Run Code Online (Sandbox Code Playgroud)

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


pep*_*per 15

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

.fullschema
Run Code Online (Sandbox Code Playgroud)

查看所有的create语句.

  • 您正在使用2012年的版本 (2认同)

Noa*_*oah 12

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

所以...(假设您的操作系统命令行提示符为$)而不是$sqlite3:

sqlite3> ATTACH database.sqlite as "attached"
Run Code Online (Sandbox Code Playgroud)

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

$sqlite3 database.sqlite
sqlite3> .dump
Run Code Online (Sandbox Code Playgroud)


小智 11

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

该数据库的表可以通过以下方式查看:

SELECT distinct tbl_name from sqlite_master order by 1;
Run Code Online (Sandbox Code Playgroud)

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

SELECT distinct tbl_name from **aa.sqlite_master** order by 1;
Run Code Online (Sandbox Code Playgroud)

请注意,您在这里也可以获得视图。要排除这些,请添加:

where type = 'table'
Run Code Online (Sandbox Code Playgroud)

在“订单”之前


Mri*_*ngh 9

使用:

import sqlite3

TABLE_LIST_QUERY = "SELECT * FROM sqlite_master where type='table'"
Run Code Online (Sandbox Code Playgroud)


ope*_*onk 9

通过a union all,将所有表组合成一个列表.

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'
Run Code Online (Sandbox Code Playgroud)


oiy*_*yio 7

由于没有人提到SQLite的官方参考,我认为在这个标题下引用它可能是有用的:

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

您可以使用此链接中描述的命令操作数据库.此外,如果您使用的是Windows操作系统,并且不知道命令shell的位置,那就在SQLite的站点中:

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

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

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

要查看您之前选择的数据库中的所有表,请键入命令.tables,如上面的链接所示.

如果您在Windows中工作,我认为将此sqlite.exe文件与其他Python文件一起移动到同一文件夹可能很有用.通过这种方式,Python文件写入并且.db文件的SQLite shell读取位于同一路径中.


小智 5

".schema"命令将通过显示用于创建所述表的语句来列出可用表及其行:

sqlite> create table_a (id int, a int, b int);
sqlite> .schema table_a
CREATE TABLE table_a (id int, a int, b int);