SQLite3, как создать оператор вставки для отношения «многие ко многим»? - PullRequest
0 голосов
/ 09 мая 2018

Допустим, у вас есть три базовые таблицы, которые реализуют отношение «многие ко многим» между задачами и категориями:

CREATE TABLE task(
    id INTEGER AUTOINCREMENT PRIMARY KEY NOT NULL,
    name INTEGER NOT NULL,
    description INTEGER NOT NULL
);
CREATE TABLE category(
    id INTEGER AUTOINCREMENT PRIMARY KEY NOT NULL,
    name TEXT NOT NULL
);
CREATE TABLE task_category(
    task_id INTEGER,
    category_id INTEGER,
);

Если я хочу вставить в свою базу данных задачу с именем «write script» с некоторым описанием «Я написал скрипт на python». что связано с категориями "python" и "scripting", как мне это сделать? Предположим, что категории python и scripting уже существуют в базе данных.

Я взглянул на этот вопрос: SQLite отношение многих ко многим?

Кажется, что некоторая реализация внешних ключей может быть полезной, но я до сих пор не знаю, как будет выглядеть оператор INSERT.

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

Каков стандартный способ вставки записи в базу данных sqlite и связывания ее с отношением «многие ко многим»?

1 Ответ

0 голосов
/ 09 мая 2018

Ограничения внешнего ключа - это просто ограничения , т. Е. Они не позволяют вставлять недопустимые данные в базу данных. Они не спасают вас от фактической вставки данных, поэтому они не имеют отношения к этому вопросу. (Они все еще полезны.)

В Python свойство lastrowid возвращает только что вставленный идентификатор:

cursor.execute("INSERT INTO task(name, description) VALUES(?, ?)",
               ["wrote script", "I wrote a python script."])
task_id = cursor.lastrowid
cursor.execute("""INSERT INTO task_category(task_id, category_id)
                  SELECT ?, id
                  FROM category
                  WHERE name IN (?, ?)""",
               [task_id, "python", "scripting"])
...