【问题标题】:Inserting Dataframe to MySQL将数据框插入 MySQL
【发布时间】:2022-11-11 04:33:31
【问题描述】:

我有一个如下所示的数据框:

import pandas as pd

student_dict = {
"ID":[101,102,103,104,105],
"Student":["AAA","BBB","CCC","DDD","EEE"],
"Mark":[50,100,99,60,80],
"Address":["St.AAA","St.BBB","St.CCC","St.DDD","St.EEE"],
"PhoneNo":[1111111111,2222222222,3333333333,4444444444,5555555555]
}

df = pd.DataFrame(student_dict)

ID  Student Mark    Address PhoneNo
101 AAA       50    St.AAA  1111111111
102 BBB      100    St.BBB  2222222222
103 CCC       99    St.CCC  3333333333
104 DDD       60    St.DDD  4444444444
105 EEE       80    St.EEE  5555555555

MySql 表(StudentTable):

CREATE TABLE StudentTable(
    ID int,
    Student varchar(255),
    Mark int,
    Address varchar(255),
    PhoneNo varchar(20),
    primary key (ID)
);

将数据框 df 插入到我使用的 MySQL 表中:

import pymysql
pymysql.install_as_MySQLdb()
from sqlalchemy import create_engine

# Create engine
engine = create_engine('mysql://user:pass@127.0.0.1/dbname')

# Create the connection and close it(whether successed of failed)
with engine.begin() as connection:
    df.to_sql(name='StudentTable', con=connection, if_exists='append', index=False)

并且数据框成功插入,如果我尝试插入另一个df,例如:

student_dict2 = {
"ID":[122,102,123],
"Student":["XXX","YYY","ZZZ"],
"Mark":[60,80,95],
"Address":["St.XXX","St.YYY","St.ZZZ"],
"PhoneNo":[1111111110,2222222222,3333333315]
}

df = pd.DataFrame(student_dict2)

ID  Student Mark    Address PhoneNo
122 XXX       60    St.XXX  1111111110
102 YYY       80    St.YYY  2222222222
123 ZZZ       95    St.ZZZ  3333333315

它会抛出一个错误

IntegrityError: (pymysql.err.IntegrityError) (1062, "Duplicate entry '102' for key 'StudentTable.PRIMARY'")

它不会将不重复的其他行插入到StudentTable 中。 我需要的是,它需要将不重复的行插入到表中,并且仅对重复的行抛出错误.有没有办法在StudentTable 中创建一个时间戳列,它会自动捕获数据插入时间

【问题讨论】:

    标签: python mysql pandas dataframe


    【解决方案1】:
    CREATE TABLE StudentTable(
        ID int,
        Student varchar(255),
        Mark int,
        Address varchar(255),
        PhoneNo varchar(20),
        created_at TIMESTAMP DEFAULT NOW() ON UPDATE CURRENT_TIMESTAMP,
        primary key (ID) 
    );
    

    我认为这就是创建时间戳列的方法,该列将尽我所知捕获数据插入时间。

    关于仅插入那些不重复的元素,我不确定,但我认为您应该遍历 student_dict 中的每一行并忽略其中具有重复 id 的那些行。

    【讨论】:

      【解决方案2】:

      您不能插入重复的密钥 ID。键值对于数据库中的每条记录必须是唯一的

      【讨论】:

        猜你喜欢
        • 2016-10-04
        • 2020-10-06
        • 1970-01-01
        • 2023-01-26
        • 1970-01-01
        • 2015-03-10
        • 2023-04-10
        • 2013-05-29
        • 1970-01-01
        相关资源
        最近更新 更多