有没有SQLite相当于MySQL的DESCRIBE [table]的功能?

495

我刚开始学习SQLite,希望能够像MySQL的DESCRIBE [table]一样查看表的详细信息。但是PRAGMA table_info [table]并不够好,因为它只提供基本信息(例如,它不显示列是否是某种字段)。SQLite有没有类似的方法呢?

8个回答

607

76
你可以在不指定表格的情况下使用 ".schema" 命令,它会显示出所有表格的结构。 - Dan Benamy
61
不要忘记在语句结尾处去掉分号。 - RTF
13
分号不是必需的。 - Simon
47
@Simon 分号会导致命令悄无声息地失败 - djeikyb
6
这应该被视为一个漏洞吗? - Makan
显示剩余4条评论

337
PRAGMA table_info([tablename]);

29
对我来说,这似乎更类似于MySQL的DESCRIBE命令,而不是.schema tablename - tybro0103
3
没错,这对我有用。.schema TABLENAME不行。但是,仅使用.schema可以显示所有的创建语句,但如果我只想查看一个表格,PRAGMA的结果会更加有用。 - Dev Kanchen
19
我认为这应该成为采纳的答案,因为它通过查询来实现,而不是依赖命令行接口。我给它点赞。 - Akoi Meexx
1
附言:我注意到的唯一问题是,当我使用INTEGER PRIMARY KEY创建表时,它不会输出PRIMARY KEY,只会输出INTEGER。 - Akoi Meexx
6
从我的原始问题:“PRAGMA table_info [table] 不够好,因为它只有基本信息(例如,它不显示列是否是某种字段)。” - Matthew
它还以更类似表格的格式显示数据,而不是从.schema命令查看CREATE语句。 - OzzyTheGiant

130

你是否在寻找用于生成表格的SQL语句?如果是,你可以查询 sqlite_schema表

sqlite> CREATE TABLE foo (bar INT, quux TEXT);
sqlite> SELECT * FROM sqlite_schema;
table|foo|foo|2|CREATE TABLE foo (bar INT, quux TEXT)
sqlite> SELECT sql FROM sqlite_schema WHERE name = 'foo';
CREATE TABLE foo (bar INT, quux TEXT)
替代名称

模式表总是可以使用名称sqlite_schema进行引用,特别是当被模式名称如main.sqlite_schema或者temp.sqlite_schema修饰时。但是出于历史兼容性的考虑,也会识别一些替代名称,包括:

  1. sqlite_master
  2. sqlite_temp_schema
  3. sqlite_temp_master

替代方案(2)和(3)仅适用于与每个数据库连接关联的 TEMP 数据库,但替代方案(1)可在任何地方使用。


1
这两者之间有什么区别吗?.schema foo和这个有什么不同吗? - Matthew
23
@Matthew:.schema 只能在命令行中使用;而上述命令可以通过库(例如 Python、C#)作为查询来运行。 - Mark Rushakoff
1
@MarkRushakoff 但结果是一样的吗? - Dvir Berebi
3
调试 WebSql 时,在 Chrome 开发者工具中使用“SELECT * FROM sqlite_master”是有效的。 - contactmatt

61
要查看所有表格:
.tables

查看特定的表:

.schema [tablename]

在方括号中给出表名是不起作用的。您必须给出.schema TABLENAME - Payel Senapati
1
@PayelSenapati 这些括号只是用来表示 tablename 是一个可选参数。 - luckman212

9

为了防止其他答案的评论误导人们:

  1. 如果.schema从sqlite_master查询没有任何输出,则表示不存在tablename,例如这也可能是由于;.schema。表格结尾,...或仅因为表格确实不存在。那么.schema无法正常工作就不太可能,此时应向sqlite项目提交错误报告。

... .schema只能从命令行使用;上述命令可以通过库(Python,C#等)运行为查询。-Mark Rushakoff Jul 25 '10 at 21:09

  1. '只能从命令行使用'可能会误导人们。几乎所有(可能每个?)编程语言都可以调用其他程序/命令。因此,引用的注释不幸地扯到另一个程序,在这种情况下是sqlite,更有可能得到支持,而不是语言提供每个程序的wrapper / library(由于存在大量的程序,这种方法不仅容易出现不完整性,而且还违反了单一来源原则,增加了维护的难度,进一步混乱了全球数据)。

2
任何编写从任何SQL数据库检索数据的程序的人都应该使用适用于其编程语言的正确SQL驱动程序来访问数据库并对其执行查询。这是访问数据库的适当方式。我绝不会建议黑客攻击旨在提供特别查询的命令行程序。您的建议是非常错误的。用于特别查询的命令行程序绝对不是程序代码运行数据库查询的最合适的访问点。使用SQL驱动程序绝对不会“使维护复杂化”-这是最佳实践。 - Medlock Perlman
1
我同意这并不是坏事,它类似于库。这就是为什么Linux|BSD发行版会提供软件包管理器的原因。也是为什么有0install跨平台PM。我的观点只是想澄清并非所有程序都需要包装器。每次都这样做并没有意义。在这种情况下(数据库处理),当然使用包装器并不是一个坏主意。 - Radagast

4
".schema" 可以显示比 "PRAGMA" 更多的表细节,包括 表约束
以下命令显示 所有表的详细信息
.schema

以下命令以良好格式显示所有表的详细信息:
.schema --indent

以下命令显示一个表格的详细信息:
.schema <table_name>

以下命令以良好格式显示一个表中的详细信息:
.schema --indent <table_name>

或者:
.schema <table_name> --indent

此外,以下命令显示关于".schema"的详细信息:
.help .schema

或者:

.help schema

那么,它看起来是这样的:

sqlite> .help .schema 
.schema ?PATTERN?        Show the CREATE statements matching PATTERN
   Options:
      --indent             Try to pretty-print the schema
      --nosys              Omit objects whose names start with "sqlite_"

2
如果您使用的是图形化工具,它会在表名旁边显示模式。对于 DB Browser For Sqlite,点击打开数据库(右上角),导航并打开您的数据库,您将看到以下表中填充的信息。

enter image description here

右键点击记录/表名,选择“复制创建语句”,然后就可以得到它了。希望对那些无法使用命令行的初学者有所帮助。

0
例如,我在我的Django SQLite数据库中有这些表:
sqlite3 db.sqlite3

那么

.tables

为了描述并查看 shop_product 表的 SQL 语句,您可以运行以下命令:
.schema shop_product

说明

Illustration


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接