Многостоловые вставки с использованием sqlalchemy - PullRequest
0 голосов
/ 20 октября 2018

У меня есть полет таблицы mysql следующим образом -

pkid       from_city            to_city
 1         Melbourne            BuenosAires
 2         Budapest             Tokyo

Затем у меня есть следующая модель sqlalchemy -

class Flight(Base):

    __tablename__ = 'flight'

    pkid = Column('pkid', INTEGER(unsigned=True), primary_key=True)
    from_city = Column('from_city', VARCHAR(50), nullable=False)
    to_city = Column('to_city', VARCHAR(50), nullable=False)

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

Ниже приведен мой сценарий

этап 1: обработка необработанных данных, манипуляции с данными и получение спискасловари, готовые для вставки в таблицу полетов, пример -

records = [{'from_city': 'Amsterdam', 'to_city': 'Toronto'},
           {'from_city': 'Mumbai', 'to_city': 'Colombo'}]

этап 2: вставка данных в таблицу полетов с использованием SQL Alchemy

этап 3: возврат списка pkid свновь вставленные записи на этапе 2

этап 4: вставить данные в таблицу авиакомпаний, где каждый pkid этапа 3 является внешним ключом в таблице авиакомпаний

этап 5: зафиксировать все транзакции, если этап 4успешный.Кроме того, транзакции второго этапа отката также

Из документации sqlalchemy я считаю, что вставки ядра в стиле executemany - это самый быстрый способ вставки записей по сравнению со стилем ORM, из-за чего мне хочется использовать опцию вставки ядра sqlalchemy.

Но при использовании вставки ядра я потеряю возможность получать первичные ключи полетных записей на этапе 3 до фактической фиксации?или есть еще способ получить первичные ключи?Учитывая, что у меня есть большие объемы данных для вставки, если я использую стиль ORM, я могу очистить и получить первичные ключи, но тогда мне придется пойти на компромисс по производительности?

Я мог бы использовать Dataframe.to_sql, но этопоставляется с функцией автоматической фиксации, которую я не хочу

В настоящее время я делаю это следующим образом -

Этап 1

Stage2

trans = connection.begin()
connection.execute(table.insert(), records)

Не знаю, как это сделать. Этап 3. Нужна помощь

Предназначен для этапа 4

Предназначен для этапа 5 - trans.commit() / trans.rollback() на основеЭтап 4

Любые предложения или советы, чтобы сделать этап 3?

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