Вставить в таблицу, если условие выполнено с помощью sqlite3 - PullRequest
4 голосов
/ 22 июля 2010

если у меня есть две таблицы: files(id, owner) и share(file_id, user), где владелец и пользователь будут первичными идентификаторами из теоретической пользовательской таблицы, как я могу вставить запись в share, только если пользователь, выполняющий совместное использование, владеет этимfile?

Это упрощенный пример, поэтому я просто буду использовать литерал для того, кто выполняет операцию общего доступа - обычно это значение берется из сеанса.Поэтому, если бы у меня было:

files:
id: 1, owner: 1

и пользователь 2 хочет увидеть файл 1, я бы использовал этот запрос:

insert into share values (1, 2)

, но это не разрешено - пользователь 2 не 'т свой файл 1, пользователь 1 делает.Я пытаюсь сделать это в одном запросе, но я не могу понять это.Я попытался:

case when (select owner from files where id=1) is 2
    then (insert into share values (1, 2));

case (select owner from files where id=1) is 2
    then (insert into share values (1, 2));

insert into share values (1, 2)
    where 2 not in (select owner from files where id=1)

и все они синтаксические ошибки.Я делаю это из Python, поэтому после этого запроса я бы просто проверил Cursor.rowcount, чтобы увидеть, равен ли он 1 или 0, а если 0, то у пользователя не было разрешения на завершение операции.

Как правильно написать этот запрос?

Ответы [ 2 ]

8 голосов
/ 25 июля 2010

Позвольте мне предложить мой подход в качестве ответа:

insert into share select id,2 as file_id from files where id=1 and owner=2;

Нет необходимости в выражении not null или внешнем ключе в вашей таблице Share, исключение для ловли.

3 голосов
/ 22 июля 2010

Ну, я нашел один способ сделать это, хотя это не то решение, которое я надеялся найти.Я мог бы добавить not null и / или внешний ключ к столбцу file_id в таблице share, а затем попробовать выполнить этот запрос:

insert into share
    values(
        (select id as file_id from files where id=1 and owner=2),
        2
    );

таким образом, запрос на выборку ничего не даст, еслипользователь не владеет идентификатором файла, и ограничение not null и / или внешнего ключа не будет выполнено, и я получу исключение в Python.

Если кто-нибудь знает реальное решение этого вопроса, пожалуйста, дайте мне знать,Я чувствую себя ужасно грязно, используя этот подход.

...