如何获得SQLite数据库表中的列列表?


102

我正在寻找检索表中的列的列表。该数据库是SQLite的最新版本(我相信是3.6)。我正在寻找使用SQL查询执行此操作的代码。与列相关的元数据的额外奖励积分(例如,长度,数据类型等)

Answers:


134

您正在寻找的被称为数据字典。在sqlite中,可以通过查询sqlite_master表(或视图?)找到所有表的列表。

sqlite> create table people (first_name varchar, last_name varchar, email_address varchar);
sqlite> select * from sqlite_master;
table|people|people|2|CREATE TABLE people (first_name varchar, last_name varchar, email_address varchar)

要获取列信息,可以使用以下pragma table_info(table_name)语句:

sqlite> pragma table_info(people);
0|first_name|varchar|0||0
1|last_name|varchar|0||0
2|email_address|varchar|0||0

有关pragma语句的更多信息,请参见文档


5
大!现在如何从命令行外部完成此操作?这是如何在我自己的C程序中完成的?
亚伦·布拉彻

我怎么能实现如上在Objective-C一样
纳格拉吉

2
@Nag,我想您认为SQLite应该将这些命令视为普通SQL,对其进行相应的处理,然后返回结果集。
Bryan Kyle

sqlite没有点快捷键select * from 吗?
jiggunjer

当您不知道表中有多少条记录可能产生数百万条记录并花费时间和资源时,请使用表中的select *。您应该添加“限制1”或类似名称。
Guy Dafny19年

55

这是简单的方法:

.schema <table>

4
这确实是答案。
Ehtesh Choudhury

19
@EhteshChoudhury不,它不应该,这个问题要求一个SQL查询,这不是一个。
jazzpi

25

这个问题很旧,但尚未提及以下内容。

在许多情况下,另一种便捷的方法是通过以下方式打开标头:

sqlite> .headers on

然后,

sqlite> SELECT ... FROM table

将在输出顶部显示一个标题,其中显示所有选定字段(如果您选择SELECT *,则全部显示)。


我的猜测是正确的,实际的问题是sqlite3默认情况下不提供查询的标头,这就是我们所有人一直在寻找的解决方案。如果您的表格太长而无法在终端上显示,则只需添加即可LIMIT 5。不要忘;了最后。
fralau

16

只需进入您的sqlite外壳:

$ sqlite3 path/to/db.sqlite3

然后就打

sqlite> .schema

您将得到一切。


1
问题是寻找SQL查询。
艾里卡

13

这是一条SELECT语句,列出了当前数据库中的所有表和列:

SELECT m.name as tableName, 
       p.name as columnName
FROM sqlite_master m
left outer join pragma_table_info((m.name)) p
     on m.name <> p.name
order by tableName, columnName
;

谢谢!如果将更ORDER BY改为,则可以按架构排序tableName, p.cid
mrm

7

这是一个查询,其中列出了所有表及其列,以及我可以根据OP请求获得的每一列的所有元数据(作为奖励积分)。

SELECT
  m.name AS table_name, 
  p.cid AS col_id,
  p.name AS col_name,
  p.type AS col_type,
  p.pk AS col_is_pk,
  p.dflt_value AS col_default_val,
  p.[notnull] AS col_is_not_null
FROM sqlite_master m
LEFT OUTER JOIN pragma_table_info((m.name)) p
  ON m.name <> p.name
WHERE m.type = 'table'
ORDER BY table_name, col_id

感谢@David Garoutte向我展示了如何开始pragma_table_info查询工作。

运行此查询以查看所有表元数据:

SELECT * FROM sqlite_master WHERE type = 'table'

1

在上面的基础上,您可以一次完成所有操作:

sqlite3 yourdb.db ".schema"

这将为您提供创建表的SQL,该表实际上是列的列表。


0

我知道,已经有很长时间了,但是永远不会太晚……我对TCL的解释器也有类似的疑问,经过几次搜索,没有发现对我有什么好处。因此,我基于PRAGMA提出一些建议,因为您知道数据库是“主要”数据库

db eval { PRAGMA main.table_info(<your table name>) } TBL { puts $TBL(name) }

和数组一起使用以获得列表

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
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.