Удаление строки из таблицы ассоциаций - PullRequest
0 голосов
/ 03 августа 2020

Я работаю над приложением, использующим python3 и SqlAlchemy для управления базой данных SQLite3. У меня есть несколько таблиц, которые имеют отношение "многие ко многим". Я создал ассоциативную таблицу для обработки этой связи.

Class Machine(Base):
    __tablename__ 'machine'
    machine_ID = Column(Integer, primary_key=True)
    etc...
Class Options(Base):
    __tableName__ 'options'
    options_ID = Column(Integer, primary_key=True)
    etc...

The association table

Machine_Options = table('machine_options', Base.metadata,
    Column('machine_FK', Integer, ForeignKey('machine.machine_ID'),
                                 primary_key=True),
    Column('options_FK',Integer, ForeignKey('options.options_ID'),
                                 primary_key=True))

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

Моя проблема в том, когда я хочу разорвать эту связь между машиной и опцией. Я пробовал прямое удаление строки из таблицы ассоциаций с помощью предложения FILTER () в machine_FK и options_FK, но SqlAlchemy выдает ошибку, сообщающую мне, что в таблице Machine_Options нет поля machine_FK. Я попытался удалить строку из Machine_Options косвенно, используя соединения с машиной и таблицей параметров, но получил другую ошибку, которую я не могу удалить или обновить с помощью соединений.

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

Пока мой поиск inte rnet оказался бесплодным.

1 Ответ

0 голосов
/ 20 августа 2020

Ответ на мою проблему - использовать myparent.children.remove(somechild)

Связь выполняется с использованием machine.children.append(option)

Использование того же кода, что и 'append', и замена 'remove' отменяет ассоциация

Код:

def removeOption(machineKey,  OptionKey):

session = connectToDatabase()

machineData = session.query(Machine).filter(Machine.machine_ID == machineKey).one()
optionData = session.query(Options).filter(Options. options_ID == OptionKey).one()
machineData.children.remove(optionData)
session.add(machineData)
session.commit()
session.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...