У меня есть полет таблицы 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?