【问题标题】:How can I get the list of a columns in a table for a SQLite database?如何获取 SQLite 数据库表中的列列表?
【发布时间】:2010-10-10 22:26:37
【问题描述】:

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

【问题讨论】:

    标签: reflection sqlite list


    【解决方案1】:

    您要查找的内容称为数据字典。在 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 语句的更多信息,请参阅documentation

    【讨论】:

    • 太棒了!现在这是如何从命令行外部完成的?这是如何在我自己的 C 程序中完成的?
    • 如何在 Objective-c 中实现与上面相同的功能
    • @Nag,我认为您认为 SQLite 应该将这些命令视为普通 SQL,对其进行相应处理,然后返回结果集。
    • sqlite 没有点快捷方式而不是select * from
    • 使用 select * from table,当您不知道表中有多少记录可能有数百万条记录的结果并且需要时间和资源时。您应该添加“limit 1”或类似的内容。
    【解决方案2】:

    进入你的 sqlite shell:

    $ sqlite3 path/to/db.sqlite3
    

    然后直接点击

    sqlite> .schema
    

    你会得到一切。

    【讨论】:

    • 问题是查找 SQL 查询。
    【解决方案3】:

    下面是简单的方法:

    .schema <table>
    

    【讨论】:

    • 这应该是真正的答案。
    • @EhteshChoudhury 不,不应该,问题要求 SQL 查询,这不是一个。
    【解决方案4】:

    这个问题很老,但尚未提及以下问题。

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

    sqlite> .headers on
    

    那么,

    sqlite> SELECT ... FROM table
    

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

    【讨论】:

    • 我的猜测是正确的,实际问题是 sqlite3 默认不提供查询的标头,那么 这就是我们一直在寻找的解决方案。如果您的表格太长而无法在终端上显示,只需添加,例如LIMIT 5。不要忘记最后的;
    【解决方案5】:

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

    sqlite3 yourdb.db ".schema"
    

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

    【讨论】:

      【解决方案6】:

      我知道,已经很久了,但永远不会太晚...... 我与 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
      

      【讨论】:

        【解决方案7】:

        这是一个列出当前数据库中所有表和列的 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,则可以按架构订购。
        【解决方案8】:

        这是一个查询,列出了所有表及其列,以及我可以根据 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'
        

        【讨论】:

          猜你喜欢
          • 2021-02-10
          • 1970-01-01
          • 1970-01-01
          • 2014-04-01
          • 2011-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多