Массовая вставка с SQLAlchemy ORM и возврат первичных ключей - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь вставить список словарей в таблицу, используя bulk_save_objects или bulk_insert_mappings. Можно ли как-нибудь получить список объектов с первичным ключом для каждой записи?

try:
    cycle_object_list = []
    for cycle in cycle_list:
        period = Period()
        for k, v in cycle.items():
            setattr(period, k, v)
        cycle_object_list.append(period)

    db.session.bulk_save_objects(cycle_object_list)
    db.session.commit()
    print(cycle_object_list)
except Exception:
    db.session.rollback()
    raise
finally:
    db.session.close()

Я ожидаю что-то вроде [Period.49, Period.50, Period.51]

Но фактический результат - [Period.None, Period.None, Period.None]

1 Ответ

1 голос
/ 08 ноября 2019

Документы

Указанные объекты не добавляются в сеанс, и для них не устанавливается дополнительное состояние, если только не установлен флаг return_defaults, в этом случаеАтрибуты первичного ключа и значения по умолчанию на стороне сервера будут заполнены.

Так что это может работать:

try:
    cycle_object_list = []
    for cycle in cycle_list:
        period = Period()
        for k, v in cycle.items():
            setattr(period, k, v)
        cycle_object_list.append(period)

    db.session.bulk_save_objects(cycle_object_list, <b>return_defaults=True</b>)
    db.session.commit()
    print(cycle_object_list)
except Exception:
    db.session.rollback()
    raise
finally:
    db.session.close()
...