ChatGPT解决这个技术问题 Extra ChatGPT

如何列出使用 ATTACH 打开的 SQLite 数据库文件中的表?

什么 SQL 可用于列出 SQLite 数据库文件中的表和这些表中的行 - 一旦我使用 SQLite 3 命令行工具上的 ATTACH 命令附加它?

试试这个,你会得到表格的完整信息 http://www.sqlite.org/pragma.html#schema
如果您有兴趣,以下是一个有用的 sqlite 图形用户界面:sqlitestudio.pl 让您可以非常快速地查看数据库、表的详细信息,并且还有一个不错的查询编辑器...
.tables 用于表,.schema ?TABLE? 用于特定表的架构。
.table 'bank_%'.table '%_empl' 也是查询前缀/后缀的有效语法!
如果您在使用 nodejs 时遇到问题,请参考此stackoverflow.com/questions/34480683/…

T
Tuna

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

列出数据库中的表:.tables 列出表的外观:.schema tablename 打印整个表:SELECT * FROM tablename;列出所有可用的 SQLite 提示命令:.help


.table.tables 都是允许的。就此而言,.ta 也可以,因为 sqlite3 将接受任何明确的命令。根据帮助的命令名称确实是“.tables”(如果有人还在关注的话)。
(这应该是公认的答案,这是最简单的做事方式)。
如果通过 ATTACH '<path>' AS <name>; 打开数据库,.tables 将不会显示表格,但 lasse 的回答会这样做。由于 OP 提到了 ATTACHing,我相信他不接受这个答案是对的。编辑:刚刚注意到安东尼和下面的其他人也指出了这一点。
@dbw:没必要。考虑您正在做一个能够使用 SQLite 或 MySql(我的情况)的数据库包装器。如果您使用 DB-vendor 特定命令,则使用更多符合 SQL 的命令将更容易移植以其他语言包装的内容。
此答案缺少上下文,因此没有帮助。
A
Anthony Williams

.tables.schema “帮助器”函数不查看 ATTACHed 数据库:它们只是在 SQLITE_MASTER 表中查询“主”数据库。因此,如果您使用

ATTACH some_file.db AS my_db;

那么你需要做

SELECT name FROM my_db.sqlite_master WHERE type='table';

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

SELECT name FROM sqlite_temp_master WHERE type='table';

只有 "SELECT name FROM sqlite_master WHERE type='table'" 对我有用
SELECT name FROM my_db.sqlite_master WHERE type='table';这对我不起作用(对于附加的数据库),它会引发错误:不存在这样的表“my_db.sqlite_master”
你说的临时表是什么意思?我刚打开 SQLite db 文件时有吗?
临时表是使用 CREATE TEMPORARY TABLE SQL 命令创建的表。当当前数据库连接关闭时,它们的内容将被删除,并且它们永远不会保存到数据库文件中。
在 sqlite3 命令模式下运行 ATTACH "some_file.db" AS my_db; 成功了!
a
ann

看来您需要通过 sqlite_master 表,如下所示:

SELECT * FROM dbname.sqlite_master WHERE type='table';

然后使用 SELECT 或类似名称手动浏览每个表以查看行。

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


不是易于阅读或记住以供将来使用的东西;内置 .tables 命令更直观
@Gryllida:尽管这可以从任何 SQL-API 中使用,因为它是有效的 SQL。并非所有地方都支持内置命令。
@DoktorJ .tables 是否已修改为显示附加数据库中的表?
在那个数据库中,是的,但是这个问题是关于显示您附加的数据库中的表。 .tables 命令是否已修改为也显示这些?
嗬!阅读理解失败......我不知何故未能抓住ATTACH参考......两次>_<
C
Christian Davén

要显示所有表格,请使用

SELECT name FROM sqlite_master WHERE type = "table"

要显示所有行,我想您可以遍历所有表,然后对每个表执行 SELECT *。但也许 DUMP 是你所追求的?


感谢您提供真正解决问题的唯一答案......“什么 SQL”,而不是可以使用什么命令......谢谢!
此外,这会每行打印一个表名,而 .tables 会打印多列表名(烦人/没用)。
a
ann

使用 .help 检查可用的命令。

.table

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


奇怪,一定是对的,但是我用的时候不行
@Jürgen K.:发生了什么事?
P
Peter Mortensen

SQLite 命令行上有一个可用的命令:

.tables ?PATTERN?      List names of tables matching a LIKE pattern

转换为以下 SQL:

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

E
Eugene Yarmash

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

SELECT name FROM sqlite_master
WHERE type='table';

所以... cur.execute(""" SELECT name FROM sqlite_master WHERE type='table';""") 还是没有?这对我不起作用,但我不确定这段代码应该在哪里运行。
唔。我在 DB Browser For Sqlite 中运行这些“点”命令,但它们不起作用。
E
Eugene Yarmash

试试 PRAGMA table_info(table-name);
http://www.sqlite.org/pragma.html#schema


这可能是最好的方法。
这仅在您知道表的名称时才有效。您不能使用它来获取表名列表。
P
Peter Mortensen

我使用此查询来获取它:

SELECT name FROM sqlite_master WHERE type='table'

并在 iOS 中使用:

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

P
Peter Mortensen

根据 the documentation,MySQL 的 SHOW TABLES; 等价于:

“.tables”命令类似于设置列表模式然后执行以下查询:

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's answer


P
Peter Mortensen

从 SQLite 3 的最新版本开始,您可以发出:

.fullschema

查看您的所有创建语句。


SQLite 版本 3.7.13 2012-07-17 17:46:21 输入“.help”获取说明 输入以“;”结尾的 SQL 语句sqlite> .fullschema 错误:未知命令或无效参数:“fullschema”。输入“.help”获取帮助
您使用的是 2012 年的版本
P
Peter Mortensen

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

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

sqlite3> ATTACH database.sqlite as "attached"

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

$sqlite3 database.sqlite
sqlite3> .dump

o
openwonk

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

select name
from sqlite_master 
where type='table'

union all 

select name 
from sqlite_temp_master 
where type='table'

P
Peter Mortensen

利用:

import sqlite3

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

o
oiyio

由于没有人提到 SQLite 的官方参考,我认为在此标题下参考它可能会很有用:

https://www.sqlite.org/cli.html

您可以使用此链接中描述的命令来操作数据库。此外,如果您使用的是 Windows 操作系统并且不知道命令 shell 在哪里,那就是在 SQLite 的站点中:

https://www.sqlite.org/download.html

下载后,点击 sqlite3.exe 文件初始化 SQLite 命令外壳。初始化时,默认情况下,此 SQLite 会话使用内存数据库,而不是磁盘上的文件,因此会话退出时所有更改都将丢失。要将永久磁盘文件用作数据库,请在终端窗口启动后立即输入“.open ex1.db”命令。

上面的示例导致名为“ex1.db”的数据库文件被打开和使用,如果它以前不存在,则创建它。您可能希望使用完整路径名来确保文件位于您认为它所在的目录中。使用正斜杠作为目录分隔符。换句话说,使用“c:/work/ex1.db”,而不是“c:\work\ex1.db”。

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

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


P
Peter Mortensen

使用 .da 查看所有数据库 - 一个称为“主数据库”。

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

SELECT distinct tbl_name from sqlite_master order by 1;

附加的数据库需要您在 ATTACH 语句中使用 AS 选择的前缀,例如 aa (, bb, cc...) 所以:

SELECT distinct tbl_name from **aa.sqlite_master** order by 1;

请注意,在这里您也可以获得视图。要排除这些添加:

where type = 'table'

在“订单”之前


佚名

“.schema”突击队将通过向您显示用于创建所述表的语句来列出可用表及其行:

sqlite> create table_a (id int, a int, b int);
sqlite> .schema table_a
CREATE TABLE table_a (id int, a int, b int);