首页 > 解决方案 > 如何使用 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')

标签: pythonmysqlpandasdataframesqlalchemy

解决方案


您可以在数据库端使用下一个解决方案:

首先:为从 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 ;

因此,您已经将值插入到测试表中,并在第二个表中获得计算结果。触发器内部的逻辑可以根据您的需要进行匹配。


推荐阅读