Вставьте ... НА ДУБЛИКОВАТЬ КЛЮЧЕВОЙ КЛЮЧ - PullRequest
1 голос
/ 21 мая 2019

Я работаю над пандамами данных и с sqlalchemy. Я пытаюсь объединить несколько идентичных баз данных в одну. Проблема в том, что таблицы могут иметь дубликаты между БД. Другая проблема заключается в том, что у меня есть что-то около 30 миллионов строк, и это приводит к потере времени при работе с кадром данных (даже с размером фрагмента).

Я пытался выполнить итерации по всему фрейму данных, но это слишком долго для проверки дубликатов. Поэтому я хотел использовать SQL-запрос INSERT ... ON DUPLICATE KEY ... do something, но единственные возможности - UPDATE и IGNORE. Я пытаюсь:
-> вставлять все строки -> по дублирующему ключу -> обновить строку, которую я пытался вставить, и вставить ее с новым идентификатором
Я не смог найти ничего с sqlalchemy для этой проблемы в Google

Что я делаю:

import pandas as pd

df = pd.DataFrame()
#put all datas in the df for one tables but from all databases

engine = create_engine("mysql://xxx:xxx@localhost/{db}".format(db=dbname))

df.to_sql(con=engine, name=tableName, if_exists='append', chunksize=chunksize, index= False)

И ошибка MYSQL - ДВОЙНОЕ ЗНАЧЕНИЕ ДЛЯ ПЕРВИЧНОГО КЛЮЧА

РЕДАКТИРОВАТЬ: Добавление схемы таблицы

table1 = Table('table1', metadata,
    Column('id', VARCHAR(40), primary_key=True,nullable=False),
    mysql_engine='InnoDB'
    )

table2= Table('table2', metadata,
    Column('id', VARCHAR(40), primary_key=True,nullable=False),
    Column('id_of', VARCHAR(20),ForeignKey("table1.id"), nullable=False, index= True)
    )

table3= Table('table3', metadata,
    Column('index',BIGINT(10), primary_key=True,nullable=False,autoincrement=True),
    Column('id', VARCHAR(40),nullable=False),
    Column('id_produit', VARCHAR(40),ForeignKey("table2.id"), nullable=False, index= True),
    Column('id_produit_enfant', VARCHAR(40),ForeignKey("table2.id"), nullable=False, index= True)
    )

table4= Table('table4', metadata,
    Column('index',BIGINT(10), primary_key=True,nullable=False,autoincrement=True),
    Column('id', VARCHAR(40),nullable=False),
    Column('id_produit', VARCHAR(40),ForeignKey("table2.id"), nullable=False, index= True)
    )

table5= Table('table5', metadata,
    Column('index',BIGINT(10), primary_key=True,nullable=False,autoincrement=True),
    Column('id', VARCHAR(40),nullable=False),
    Column('id_produit', VARCHAR(40),ForeignKey("table2.id"), nullable=False, index= True)
    )

table6= Table('table6', metadata,
    Column('index',BIGINT(10), primary_key=True,nullable=False,autoincrement=True),
    Column('id', VARCHAR(40),nullable=False),
    Column('id_produit', VARCHAR(40),ForeignKey("table2.id"), nullable=False, index= True)
    )

1 Ответ

2 голосов
/ 21 мая 2019

Ваша проблема:

DUPLICATE VALUE FOR PRIMARY KEY

Это индекс в пандах.Panda допускает дублирование, поскольку индекс и MySQL и другие реляционные базы данных не допускают этого.

Первичный ключ - это специальный столбец таблицы реляционной базы данных (или комбинация столбцов), предназначенный для уникальной идентификации всех записей таблицы.,Основные функции первичного ключа: он должен содержать уникальное значение для каждой строки данных.

Поэтому ваша проблема заключается в том, как устранить дубликатов в индексе панд.

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