python - Insert ... ON DUPLICATE KEY INSERT something new 内容

标签 python mysql pandas sqlalchemy

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

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

最佳答案

你的问题是:

DUPLICATE VALUE FOR PRIMARY KEY

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

A primary key is a special relational database table column (or combination of columns) designated to uniquely identify all table records. A primary key's main features are: It must contain a unique value for each row of data.

所以你的问题是如何消除duplicates在 Pandas 索引上。

关于python - Insert ... ON DUPLICATE KEY INSERT something new 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56233696/

相关文章:

python - Python 中的 set.copy() 是原子的吗?

python - 如何将聚合和groupby应用于python中的DataFrame?

php - MySQL:AND + 参数选择和跳过问题

python - "Zipping"按列值的两个数据帧

python - 使用 pandas 从数据框中的列中仅删除前两个字符

python - 循环遍历列表和逐个循环对象之间的区别?

python - 如何让 sympy 承认 0/0 是除以零

MySQL 左连接多个列对

mysql - 如何指定多个自连接的排序顺序

python - 仅具有高亮值的 matplotlib 条形图