插入...在重复的键上插入新内容

时间:2019-05-21 07:56:25

标签: python mysql pandas sqlalchemy

我正在使用pandas数据框并使用sqlalchemy。我想做的是将多个相同的数据库合并为一个。问题在于表在数据库之间可能重复。 另一个问题是我大约有3000万行,这在处理数据帧(甚至使用块大小)时会造成时间损失。

我试图遍历整个数据帧,但是对于检查重复项来说太长了。因此,我想使用SQL查询INSERT ... ON DUPLICATE KEY ... do something,但是唯一的可能性是UPDATEIGNORE。我正在尝试的是:
 ->插入每行->在重复键上->更新我尝试插入的行,并使用新ID插入
对于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 个答案:

答案 0 :(得分:2)

您的问题是:

DUPLICATE VALUE FOR PRIMARY KEY

这是熊猫的索引。 Panda允许重复,因为索引和MySQL及其他关系数据库不允许重复。

  

主键是特殊的关系数据库表列(或列的组合),指定用于唯一地标识所有表记录。主键的主要功能是:它必须为每行数据包含一个唯一值。

所以您的问题是如何消除熊猫索引上的duplicates

相关问题