SQLalchemy Массовая вставка с отношением один к одному

У меня есть следующая модель, где TableA и TableB имеют отношение 1 к 1:

class TableA(db.Model): id = Column(db.BigInteger, primary_key=True) title = Column(String(1024)) table_b = relationship('TableB', uselist=False, back_populates="table_a") class TableB(db.Model): id = Column(BigInteger, ForeignKey(TableA.id), primary_key=True) a = relationship('TableA', back_populates='table_b') name = Column(String(1024)) 

когда я вставляю 1 запись, все идет хорошо:

 rec_a = TableA(title='hello') rec_b = TableB(a=rec_a, name='world') db.session.add(rec_b) db.session.commit() 

но когда я пытаюсь сделать это для большинства записей:

 bulk_ = [] for title, name in zip(titles, names): rec_a = TableA(title=title) bulk_.append(TableB(a=rec_a, name=name)) db.session.bulk_save_objects(bulk_) db.session.commit() 

Я получаю следующее исключение:

 sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1364, "Field 'id' doesn't have a default value") 

Я делаю что-то неправильно? Я неправильно настроил модель? Есть ли способ для передачи данных такого типа?

One Solution collect form web for “SQLalchemy Массовая вставка с отношением один к одному”

Ошибка, которую вы видите, вызывается Mysql. Он жалуется, что попытка вставить записи в table_b нарушает ограничение внешнего ключа.

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

 bulk_titles = [TableA(title=title) for title in titles] session.bulk_save_objects(bulk_titles, return_defauls=True) bulk_names = [TableB(id=title.id, name=name) for title, name in zip(bulk_titles, names)] session.bulk_save_objects(bulk_names) 

return_defaults=True требуется выше, потому что нам нужно title.id во второй операции. Но это значительно снижает прирост производительности при работе навалом

Чтобы избежать ухудшения производительности из-за return_defauts=True , вы могли бы генерировать первичные ключи из приложения, а не базу данных, например, используя uuids или получать максимальный идентификатор в каждой таблице и генерировать диапазон от этого начального значения.

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

  • SQLAlchemy DetachedInstanceError с регулярным атрибутом (а не отношением)
  • Принуждение sqlalchemy ORM get () вне карты идентификации
  • Есть ли средство автоматизации SQLAlchemy, например South для Django?
  • Как присоединиться к трем таблицам с SQLalchemy и сохранить все столбцы в одной из таблиц?
  • Избегание «сервера MySQL ушло» на редко используемом сервере Python / Flask с SQLAlchemy
  • SQLAlchemy left join с использованием подзапроса
  • Обратное определение декларативного класса SQLAlchemy из существующей базы данных MySQL?
  • DELIMITER / Создание триггера в SQLAlchemy
  • Python - лучший язык программирования в мире.