Как разрешить отношение «многие к одному» при вставке в sqlalchemy 2.0?Python

Программы на Python
Anonymous
Как разрешить отношение «многие к одному» при вставке в sqlalchemy 2.0?

Сообщение Anonymous »

У меня есть большое количество данных из разных систем сбора данных. Это ORM, определенный с помощью SQLalchemy:

Код: Выделить всё

class DataTable(Base):
__tablename__ = "data_table"
id: Mapped[int] = mapped_column(primary_key=True)
system_id: Mapped[int] = mapped_column(ForeignKey("system.id"))
system: Mapped["System"] = relationship()
data_feature: Mapped[int] = mapped_column(String(32))

class System(Base):
__tablename__ = "system"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(16))
system_feature: Mapped[str] = mapped_column(String(16))
Системы уже есть в БД. Теперь я хочу поместить в БД большое количество данных (~ 200 тыс.). Каждая строка данных содержит имя системы. Я хочу преобразовать эти имена во время загрузки БД в соответствующие идентификаторы. На данный момент я разрешаю имена систем, используя pandas.merge на стороне клиента. Я удаляю столбцы имени системы из myData pandas.DataFrame и переименовываю столбец id (из таблицы систем)

Код: Выделить всё

system_table = session.execute(select(System.id, System.name)).all()
system_table_df = pandas.DataFrame(system_table)
new_data = myData.merge(system_table_df, left_on='system_name',
right_on='name').drop(['system_name', 'name'], axis=1)
new_data.rename(columns={'id': 'system_id'}, inplace=True)
Тогда я смогу вставить данные в БД.

Код: Выделить всё

session.execute(insert(DataTable).values(myData.to_dict(orient='records'))
session.commit()
Есть ли способ выполнить разрешение системного идентификатора в БД?
Я попробовал с помощью метода Insert().returning(), который подвел меня довольно близко, но не совсем выполнил свою работу. Я не знаю, как перехватить атрибут system_name из myData и использовать его в предложенииwhere.

Код: Выделить всё

session.execute(
insert(DataTable).values(
system_id=select(System.id).where(System.name == "???")
).returning(DataTable), myData.to_dict(orient="records"))
Другой подход заключался в использовании session.add(), как в разделе «Как создать ссылку на внешний ключ с помощью sqlalchemy». Тоже не получилось.

Подробнее здесь: https://stackoverflow.com/questions/786 ... lchemy-2-0

Вернуться в «Python»