python - 如何使用 SQLAlchemy 将 Pandas DataFrame 插入 MySQL
问题描述
我正在将数据从数据帧推送到 MySQL,现在它只是在数据不存在时才向表中添加新数据(附加)。这很完美,但是我也希望我的代码检查记录是否已经存在,然后它需要更新。所以我需要它来追加+更新。我真的不知道如何开始解决这个问题,因为我被卡住了......以前有人试过吗?
这是我的代码:
engine = create_engine("mysql+pymysql://{user}:{pw}@localhost/{db}"
.format(user="root",
pw="*****",
db="my_db"))
my_df.to_sql('my_table', con = engine, if_exists = 'append')
解决方案
您可以在数据库端使用下一个解决方案:
首先:为从 Pandas 插入数据创建表(我们称之为测试):
CREATE TABLE `test` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL,
`capacity` INT(11) NOT NULL,
PRIMARY KEY (`id`)
);
第二:为结果数据创建表(我们称之为累积测试)与测试完全相同的结构:
CREATE TABLE `cumulative_test` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL,
`capacity` INT(11) NOT NULL,
PRIMARY KEY (`id`)
);
第三:在每次插入测试表时设置触发器将在第二个表中插入矿石更新记录,如:
DELIMITER $$
CREATE
/*!50017 DEFINER = 'root'@'localhost' */
TRIGGER `before_test_insert` BEFORE INSERT ON `test`
FOR EACH ROW BEGIN
DECLARE _id INT;
SELECT id INTO _id
FROM `cumulative_test` WHERE `cumulative_test`.`name` = new.name;
IF _id IS NOT NULL THEN
UPDATE cumulative_test
SET `cumulative_test`.`capacity` = `cumulative_test`.`capacity` + new.capacity;
ELSE
INSERT INTO `cumulative_test` (`name`, `capacity`)
VALUES (NEW.name, NEW.capacity);
END IF;
END;
$$
DELIMITER ;
因此,您已经将值插入到测试表中,并在第二个表中获得计算结果。触发器内部的逻辑可以根据您的需要进行匹配。
推荐阅读
- typescript - 类型“{}”不可分配给类型“从不”。(2322)
- python - App-Store-Review-Scraping:AppStoreScraper 无法识别 app-id
- asp.net - 在提交给 HomeController 之前将 input[type=file] 转换为 Base64
- php - How do I redirect to another page in a condition using php?
- python - 如何在数字中添加文字?Python
- elasticsearch - 在 Elasticsearch 上,如何根据字段中的项目数进行聚合?
- python - 使用 python jsocket 处理连接关闭
- faktor-ips - Faktor-IPS MessageList 是否有任何匹配器可用?
- java - Apache Http 客户端是否在没有消息的情况下处理状态代码?(Curl 有效,但 Http 客户端失败)
- python - discord-py-slash 问题:`cog_ext.cog_slash` 有冷却装饰器吗?