Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reflection 如何获取SQLite数据库表中的列列表?_Reflection_Sqlite_List - Fatal编程技术网

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

Reflection 如何获取SQLite数据库表中的列列表?,reflection,sqlite,list,Reflection,Sqlite,List,我希望检索表中的列列表。该数据库是SQLite的最新版本(我相信是3.6)。我正在寻找通过SQL查询实现这一点的代码。与列相关的元数据(例如长度、数据类型等)的额外加分。您要查找的是数据字典。在sqlite中,可以通过查询sqlite_主表(或视图?)找到所有表的列表 要获取列信息,可以使用pragma table\u info(table\u name)语句: sqlite> pragma table_info(people); 0|first_name|varchar|0||0 1|l

我希望检索表中的列列表。该数据库是SQLite的最新版本(我相信是3.6)。我正在寻找通过SQL查询实现这一点的代码。与列相关的元数据(例如长度、数据类型等)的额外加分。

您要查找的是数据字典。在sqlite中,可以通过查询sqlite_主表(或视图?)找到所有表的列表

要获取列信息,可以使用
pragma table\u info(table\u 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语句的更多信息,请参见。

进入sqlite shell:

$ sqlite3 path/to/db.sqlite3
然后直接打

sqlite> .schema
你会得到一切。

这里有一个简单的方法:

.schema <table>
.schema

这个问题很老了,但下面的问题还没有提到

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

sqlite> .headers on
那么


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

基于上述内容,您可以一次完成所有操作:

sqlite3 yourdb.db ".schema"

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

我知道,已经很久了,但永远都不会太晚… 我有一个类似的问题,TCL作为翻译,经过几次搜索,没有发现对我有好处的。因此,我基于PRAGMA提出了一些建议,知道您的DB是“main”

db eval { PRAGMA main.table_info(<your table name>) } TBL { puts $TBL(name) }
db eval{PRAGMA main.table_info()}TBL{put$TBL(name)}
和数组用于获取列表

set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
set col_list{}
db eval{PRAGMA main.table_info()}TBL{lappend col_list$TBL(name)}
将$col_放入列表

下面是一条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
;
选择m.name作为tableName,
p、 列名称
来自sqlite_master m
左外连接pragma_表信息((m.name))p
关于m.name p.name
按表名、列名排序
;

这是一个查询,它列出了所有表及其列,以及我可以根据OP请求获得的关于每个列的所有元数据(作为额外积分)


伟大的现在,如何从命令行外部执行此操作?这是如何在我自己的C程序中实现的?我如何在Objective中实现上述功能-c@Nag,我认为SQLite应该将这些命令视为普通SQL,进行相应的处理,并返回一个结果集。SQLite不是有一些点快捷方式而不是
select*from
?使用select*from table,当您不知道表中有多少记录可能有百万记录的结果,并且需要时间和资源时。您应该添加“限制1”或类似的内容。这应该是答案。@EhteshChoudhury不应该,问题要求的是SQL查询,而不是SQL查询。问题要求的是SQL查询。谢谢!如果您将
orderby
更改为
tableName,p.cid
,则可以按模式排序。我想实际问题是sqlite3默认不提供查询头,这就是我们一直在寻找的解决方案。如果您的表格太长,无法在终端上显示,只需添加,例如
LIMIT 5
。不要忘记
在末尾。
set col_list {}
db eval { PRAGMA main.table_info(<your table name>) } TBL { lappend col_list $TBL(name) }
puts $col_list
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
;
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
SELECT * FROM sqlite_master WHERE type = 'table'