Система: MariaDB 10.3.15, python 3.7.2, пакет python mysql.connector
У меня проблемы с определением точной причины проблемы, возможно, с ошибкойв MariaDB / mySQL при выполнении запроса со структурой таблицы, как описано ниже.Запутывающая часть - это сообщение об ошибке
1356 (HY000): View 'test_project.denormalized' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
, которое сначала кажется связанным с проблемой, но чем дальше я копаюсь, почему это происходит, тем больше я чувствую этосообщение об ошибке - красная сельдь.
Шаги для воспроизведения:
CREATE DATABASE `test_project`;
USE `test_project`;
CREATE TABLE `normalized` (
`id` INT NOT NULL AUTO_INCREMENT,
`foreign_key` INT NOT NULL,
`name` VARCHAR(45) NOT NULL,
`value` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
INSERT INTO `normalized` (`foreign_key`, `name`, `value`) VALUES
(1, 'attr_1', '1'),
(1, 'attr_2', '2'),
(2, 'attr_1', '3'),
(2, 'attr_2', '4');
CREATE OR REPLACE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `denormalized` AS
select
max(`iq`.`foreign_key`) AS `foreign_key`,
max(`iq`.`attr_1`) AS `attribute_1`,
max(`iq`.`attr_2`) AS `attribute_2`
from (
select
`foreign_key` AS `foreign_key`,
if(`name` = 'attr_1',`value`,NULL) AS `attr_1`,
if(`name` = 'attr_2',`value`,NULL) AS `attr_2`
from `normalized`
) as `iq`
group by `iq`.`foreign_key`;
Используя python, подключитесь к базе данных и выполните следующий запрос:
conn = mysql.connector.connect(host="somehost", user="someuser", password="somepassword")
cursor = conn.cursor()
query = """select * from denormalized as d
where d.`foreign_key` in
(
SELECT distinct(foreign_key)
FROM normalized
where value = %s
);"""
cursor.execute(query, ["2"])
results = cursors.fetchall()
Дополнительная информация: Сначала я подумал, что, очевидно, это проблема привилегий, но даже использование root для всего и двойная проверка хостов и определенных привилегий ничего не изменили.
Затем яглубже вникли в то, что делают соответствующие запросы и представления (приведенный выше контрольный пример - сокращенная версия того, что на самом деле находится в нашей базе данных), и проверили каждую часть.Выбор из вида работает.Выполнение запроса вида работает.Выбор из представления со статическим подзапросом работает.Фактически, замена представления в проблемном запросе его определением тоже работает.
Я сводил его к выбору из представления, используя подзапрос в предложении where
, используя параметры этого подзапроса.Это приводит к появлению ошибки.Использование статического подзапроса или замена представления его определением работает просто отлично, только это конкретное обстоятельство, когда оно терпит неудачу.
И я понятия не имею, почему.