Массовая вставка в таблицы с отношением «многие ко многим» с помощью SQLAlchemy.Python

Программы на Python
Ответить
Anonymous
 Массовая вставка в таблицы с отношением «многие ко многим» с помощью SQLAlchemy.

Сообщение Anonymous »


У меня есть таблица сотрудников. Каждый сотрудник может обсуждать с клиентами те или иные продукты компании, т. е. у нас между сотрудниками и продуктами существует связь «многие ко многим». Схема следующая:

metadata_obj = MetaData() cv_calls_table = Таблица( "сотрудник", метаданные_объект, Столбец("id", Целое число, Primary_key=True), Столбец("имя", строка), Столбец("key_id", String, nullable=True), ) cv_products_table = Таблица( "продукты", метаданные_объект, Столбец("id", Целое число, Primary_key=True), Столбец("продукт", строка), ) call_has_product_table = Таблица( "employee_has_product", метаданные_объект, Column("employee_id", Integer, ForeignKey("employee.id")), Столбец("product_id", Integer, ForeignKey("products.id")), ) Предполагая, что у меня есть CSV-файл, скажем, с миллионом строк, следующего вида:

+-----------+-----------+----------+ | Имя | ключ_ид | продукт | +-----------+-----------+----------+ | Джон Доу | xyz |груши | +-----------+-----------+----------+ | Джон Доу | xyz |яблоки | +-----------+-----------+----------+ | Энн Смит | abc |апельсины | +-----------+-----------+----------+ | Энн Смит | abc |яблоки | +-----------+-----------+----------+ Как лучше всего выполнить массовую вставку в мою базу данных с использованием Pandas (для чтения файла csv) и SQLAlchemy? Вставка данных о сотрудниках и продуктах в таблицы не представляет проблем. Я изо всех сил пытаюсь найти аккуратный способ вставить первичные ключи сотрудников и фруктов в соединительную таблицу call_has_product_table .

Я использую базу данных SQLite.

Я пробовал использовать ORM SQLAlchemy, но кажется, что добавление элементов в связь можно выполнять только индивидуально для каждого сотрудника, что неосуществимо с точки зрения производительности. Поэтому я попытался настроить базу данных с помощью ядра. Код, который я использовал с подходом ORM, был

#хранить только данные сотрудников сотрудники = сотрудник_данные.drop_duplications(subset=['Name','key_id']).reset_index(drop=True) с сеансом (движком) в качестве сеанса: указать = [] для меня в сотрудниках.index: #Доступ к каждому сотруднику сотрудник_строка = сотрудники.iloc[i,:] #Создаем соответствующий объект сотрудник_ = Сотрудник (имя = строка_сотрудника['Имя'], key_id = данные_сотрудника['key_id']) #Получить продукты, связанные с выбранным в данный момент сотрудником prods_ = сотрудник_данные.loc[(employee_data.Name == сотрудник_строка['Имя']) & (employee_data.key_id == сотрудник_строка['key_id']), 'Продукт'].to_list() #Создаем соответствующие объекты Product Products_ = [Продукт(продукт = prod_) для prod_ в prods_] #Добавить объекты продукта текущему сотруднику сотрудник_.продукты.расширить(продукты_) emply.append(сотрудник_) session.add_all(emply) сеанс.коммит() сеанс.закрытие() где employee_data — это кадр данных Pandas в форме приведенной выше таблицы.

Я также мог бы решить проблему с Pandas, выбрав id для employee и products, но я думаю, что должен быть лучший вариант. Кстати, только используя возможности SQLAlchemy (или, возможно, чистого SQL).
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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