SQLAlchemy большие вставки со связями - PullRequest
0 голосов
/ 08 февраля 2019

Что-то, с чем я борюсь в SQLAlchemy.Предположим, у меня есть две модели моделей:

TextLocator
----------------
id (primary key)
docid
span_start
span_end
UNIQUE constraint docid, span_start, span_end

tags = relationship('Tag', back_populates='text_locator')

Tag
----------------
id
locator_id (Foreign Key text_locator.id)
tag_name

text_locator = relationship('TextLocator', back_populates='tags')

Если я импортирую CSV с миллионом строк и каждой строкой: docid, span_start, span_end, tag_name

Какой самый эффективный способ вставки в SQLA для меняэто в таблицу тегов?

Проблема, с которой я сталкиваюсь, заключается в поиске TextLocator, который необходимо создать, по сравнению с запросом.

Если бы я делал по 1 строке за раз, я мог бы что-то сделатькак:

text_locator_instance = (
session.query(TextLocator)
.filter(
and_(docid == <docid>. span_start == <span_start, span_end == <span_end>)).first()

if not text_locator_instance:
    text_locator_instance = TextLocator(docid=<docid>, span_start=<span_start>, span_end=<span_end>)

tag_instance = Tag(tag_name=<tag_name>)
tag_instance.text_locator = text_locator_instance

Как бы я сделал это в масштабе с 1 миллионом строк?

Если бы это был чистый SQL, я бы вставил 1 миллион CSV в временную таблицу, ПРИСОЕДИНЯЙТЕСЬ кTextLocator для получения идентификаторов, вставьте в TextLocator, где соединение не удается, а затем вставьте в теги все идентификаторы через JOIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...