首页 > 解决方案 > Insert ... ON DUPLICATE KEY INSERT 新的东西

问题描述

我正在使用 pandas 数据框和 sqlalchemy 。我想做的是将多个相同的数据库合并为一个。问题是这些表可能在数据库之间有重复。另一个问题是我有大约 30M 行,这会导致在处理数据帧(即使使用块大小)时浪费时间。

我试图遍历整个数据框,但这对于检查重复项来说太长了。所以我想使用 SQL 查询INSERT ... ON DUPLICATE KEY ... do something,但唯一的可能性是UPDATEand IGNORE。我正在尝试的是:
->插入每一行->在重复键上->更新我尝试插入的行并用新的id插入
我在google上找不到任何关于这个问题的sqlalchemy

我在做什么:

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 错误是 DUPLICATE VALUE FOR PRIMARY KEY

编辑:添加表模式

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)
    )

标签: pythonmysqlpandassqlalchemy

解决方案


你的问题是:

DUPLICATE VALUE FOR PRIMARY KEY

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

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

所以你的问题是如何消除熊猫索引上的重复项。


推荐阅读