使用 SQLite 获取存在特定 ID 值的所有表的列表
Posted
技术标签:
【中文标题】使用 SQLite 获取存在特定 ID 值的所有表的列表【英文标题】:Get a list of all the tables a specific ID value exists in with SQLite 【发布时间】:2022-01-03 10:55:18 【问题描述】:我正在使用 SQLite v3.31.1 和 python 3.7.9。
如何识别特定 id 值存在于哪些表中?我认为这样的东西在 mysql 中以“INFORMATION_SCHEMA”的形式存在,但我还没有找到 SQLite 替代方案。
我有一个表结构,它遵循我认为的“类表继承”。基本上,我有一个产品表,其中包含所有产品共有的属性,以及包含该类产品的特定属性的表。 “Products”主表包含一个作为主键的 id 列,在子表中用作外键。因此,产品表和子表中都存在特定项目,但其他地方都不存在(FTS 的一些虚拟表除外)。
我目前的解决方案是获取所有表名
SELECT tbl_name
FROM sqlite_master
WHERE type='table'
然后使用循环遍历表格
SELECT 1
FROM child_table
WHERE id = value
但似乎应该有更好的方法。
谢谢。
【问题讨论】:
这是要走的路,因为 SQLite 不支持动态 sql。 【参考方案1】:虽然我最初发布的答案有效,但速度很慢。你可以在 python 中添加一个哈希映射,但是在重新构建哈希映射时它会很慢。
相反,我在我的 SQL 设置中使用触发器来创建包含相关信息的表。这有点脆弱,但对于大量搜索结果来说要快得多,因为数据库只查询一次,并且在数据库初始化时加载表。
我的例子,有一个名为 Products 的父表,它的主键为 id。
CREATE TABLE IF NOT EXISTS ThermalFuse (
id INTEGER NOT NULL,
ratedTemperature INTEGER NOT NULL,
holdingTemperature INTEGER NOT NULL,
maximumTemperature INTEGER NOT NULL,
voltage INTEGER NOT NULL,
current INTEGER NOT NULL,
FOREIGN KEY (id) REFERENCES Product (id)
);
CREATE TABLE IF NOT EXISTS Table_Hash (
id INTEGER NOT NULL,
table_name TEXT NOT NULL,
FOREIGN KEY (id) REFERENCES Product (id)
);
CREATE TRIGGER ThermalFuse_ai AFTER INSERT ON ThermalFuse
BEGIN
INSERT INTO Table_Hash (id, table_name)
VALUES (new.id, 'ThermalFuse');
END;
【讨论】:
以上是关于使用 SQLite 获取存在特定 ID 值的所有表的列表的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Diesel 和 SQLite 获取新创建值的 id?