python - Insert ... ON DUPLICATE KEY INSERT 新的东西
问题描述
我正在使用 pandas 数据框和 sqlalchemy 。我想做的是将多个相同的数据库合并为一个。问题是这些表可能在数据库之间有重复。另一个问题是我有大约 30M 行,这会导致在处理数据帧(即使使用块大小)时浪费时间。
我试图遍历整个数据框,但这对于检查重复项来说太长了。所以我想使用 SQL 查询INSERT ... ON DUPLICATE KEY ... do something
,但唯一的可能性是UPDATE
and 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)
)
解决方案
你的问题是:
DUPLICATE VALUE FOR PRIMARY KEY
这是熊猫中的索引。Panda 允许重复,因为索引和 MySQL 和其他关系数据库不允许这样做。
主键是一个特殊的关系数据库表列(或列组合),被指定用于唯一标识所有表记录。主键的主要特点是: 它必须包含每行数据的唯一值。
所以你的问题是如何消除熊猫索引上的重复项。
推荐阅读
- javascript - 在本地捕获 mux.monitor 对象
- python - 如何从不同表中的字段创建复合外键?
- node.js - TypeORM - 如何在不先获取关系的情况下使用外键插入表
- jupyter-notebook - 使用 sys.stdout 时 jupyter 笔记本单元未终止
- firefox - 如何通过命令行编辑 about:config 中的配置,而无需重新启动 Firefox 来应用它?
- php - 如何使用 PHP 自动更新自定义帖子的特色图片?
- twincat - 事件记录器事件未显示在事件网格控件中
- javascript - Javascript 比较函数在 Firefox 和 Chrome 之间的行为不同
- elasticsearch - 我已经设置了启用 Xpack 安全性的 EFK 堆栈,它运行良好,直到其中一个 Elasticsearch pod 重新启动
- java - Android 中类似 facebook 的反应按钮