关于SQL:如何列出用Attach打开的sqlite数据库文件中的表?

关于SQL:如何列出用Attach打开的sqlite数据库文件中的表?

How to list the tables in a SQLite database file that was opened with ATTACH?

什么SQL可以用来列出表,以及sqlite数据库文件中这些表中的行-在我将它与sqlite 3命令行工具上的ATTACH命令附加之后?


有几个步骤可以查看SQLite数据库中的表:

  • 列出数据库中的表:

    1
    .tables
  • 列出表的外观:

    1
    .schema tablename
  • 打印整个表格:

    1
    SELECT * FROM tablename;
  • 列出所有可用的sqlite提示命令:

    1
    .help

  • .tables.SCHEMA的"helper"函数不查找附加的数据库:它们只查询SQLITE_MASTER表中的"main"数据库。因此,如果您使用

    1
    ATTACH some_file.db AS my_db;

    那么你需要做

    1
    SELECT name FROM my_db.sqlite_master WHERE TYPE='table';

    请注意,临时表也不会出现在.tables中:您必须为此列出sqlite_temp_master

    1
    SELECT name FROM sqlite_temp_master WHERE TYPE='table';


    您似乎需要通过sqlite_主表,如下所示:

    1
    SELECT * FROM dbname.sqlite_master WHERE TYPE='table';

    然后用一个SELECT或类似的方法手工遍历每个表,以查看行。

    .DUMP.SCHEMA命令似乎根本看不到数据库。


    要显示所有表,请使用

    1
    SELECT name FROM sqlite_master WHERE TYPE ="table"

    为了显示所有的行,我想您可以遍历所有的表,并对每个表执行select*。但也许你想要的是垃圾场?


    使用.help检查可用命令。

    1
    .table

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


    在sqlite命令行上有一个可用于此操作的命令:

    1
    .tables ?PATTERN?      List names OF TABLES matching a LIKE pattern

    它转换为以下SQL:

    1
    2
    3
    4
    5
    6
    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


    要列出表,还可以执行以下操作:

    1
    2
    SELECT name FROM sqlite_master
    WHERE TYPE='table';

    试试PRAGMA table_info(table-name);。http://www.sqlite.org/pragma.html架构


    我用这个查询得到它:

    1
    SELECT name FROM sqlite_master WHERE TYPE='table'

    在iOS中使用:

    1
    NSString *aStrQuery=[NSString stringWithFormat:@"SELECT name FROM sqlite_master WHERE type='table'"];

    根据文件,mysqls的SHOW TABLES;相当于:

    The".tables" command is similar to setting list mode then executing
    the following query:

    1
    2
    3
    4
    5
    6
    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;

    但是,如果您正在检查单个表是否存在(或获取其详细信息),请参见@luizgeron answer。


    从最新版本的sqlite 3开始,您可以发布:

    1
    .fullschema

    查看所有的create语句。


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

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

    1
    sqlite3> ATTACH DATABASE.sqlite AS"attached"

    从操作系统命令行中,直接打开数据库:

    1
    2
    $sqlite3 DATABASE.sqlite
    sqlite3> .dump

    用途:

    1
    2
    3
    import sqlite3

    TABLE_LIST_QUERY ="SELECT * FROM sqlite_master where type='table'"

    通过union all将所有表合并到一个列表中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT name
    FROM sqlite_master
    WHERE TYPE='table'

    UNION ALL

    SELECT name
    FROM sqlite_temp_master
    WHERE TYPE='table'

    由于没有人提到过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"的数据库文件,如果该文件以前不存在,则创建该文件。您可能需要使用完整的路径名来确保文件位于您认为它所在的目录中。使用正斜杠作为目录分隔符。换句话说,使用"c:/work/ex1.db",而不是"c:workex1.db"。

    若要查看以前选择的数据库中的所有表,请键入命令.tables,如上面链接中所述。

    如果您在Windows中工作,我认为将这个sqlite.exe文件移动到与其他python文件相同的文件夹中可能会很有用。这样,python文件写入和sqlite shell读取.db文件的路径相同。


    .schema命令将列出可用的表及其行,方法是显示用于创建所述表的语句:

    1
    2
    3
    sqlite> CREATE table_a (id INT, a INT, b INT);
    sqlite> .schema table_a
    CREATE TABLE table_a (id INT, a INT, b INT);


    .da查看所有数据库-一个称为"main"

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

    按1从sqlite_主订单中选择不同的tbl_名称;

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

    按1从aa.sqlite_主订单中选择不同的tbl_名称;

    请注意,这里也有视图。排除这些添加其中type='table'在"订单"之前


    推荐阅读