Получите список всех таблиц, в которых существует определенное значение идентификатора, с помощью SQLite

#python #mysql #sql #sqlite #flask

Вопрос:

Я использую SQLite v3.31.1 и python 3.7.9.

Как определить, в каких таблицах существует определенное значение идентификатора? Я думаю, что что-то подобное существует в MYSQL как «INFORMATION_SCHEMA», но я не нашел альтернативы SQLite.

У меня есть структура таблицы, которая следует тому, что, по моему мнению, называется «Наследованием таблиц классов». В принципе, у меня есть таблица продуктов, которая имеет атрибуты, общие для всех продуктов, плюс таблицы, содержащие конкретные атрибуты для этого класса продуктов. Основная таблица «Продукты» содержит столбец идентификатора, который является первичным ключом, он используется в качестве внешнего ключа в дочерних таблицах. Таким образом, конкретный элемент существует как в таблице продуктов, так и в дочерней таблице, но нигде больше (кроме некоторых виртуальных таблиц для FTS).

Мое текущее решение состоит в том, чтобы получить имена всех таблиц, такие как

 SELECT tbl_name  FROM sqlite_master  WHERE type='table'  

а затем пройдите по таблицам, используя

 SELECT 1 FROM child_table WHERE id = value  

но, похоже, должен быть лучший способ.

Спасибо.

Комментарии:

1. Это правильный путь, потому что SQLite не поддерживает динамический sql.

Ответ №1:

Хотя ответ, который я первоначально опубликовал, будет работать, он медленный. Вы можете добавить хэш-карту в python, но она будет работать медленно, пока хэш-карта будет перестроена.

Вместо этого я использую триггеры в своей настройке SQL для создания таблицы с соответствующей информацией. Это немного сложнее, но намного быстрее для большого количества результатов поиска, так как бд запрашивается только один раз, а таблица загружается при инициализации базы данных.

Мой пример, — есть родительская таблица под названием Продукты, которая имеет первичный ключ идентификатора.

 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;