【问题标题】:Load dataframe to database table but keeping existing table structure将数据框加载到数据库表但保留现有的表结构
【发布时间】:2023-03-22 00:31:01
【问题描述】:

我有想要加载到现有 mysql 数据库表中的数据框。数据框列名称与数据库表中的名称匹配。加载数据有效,但表结构(列数据类型)已更改。此外,我在同一个数据库表中还有附加字段 TIMESTAMP 类型,该类型在插入数据时会自动更新,但不知何故,在加载数据帧后该字段不再存在。

这是我如何连接到 mysql 的代码:

import pandas as pd
import pymysql
import pyodbc
from sqlalchemy import create_engine
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.ext.declarative import declarative_base

 engine = create_engine('mysql+pymysql://{0}:{1}@{2}:{3}/{4}'.format(mysql["user"], mysql["pw"], mysql["host"], mysql["port"], mysql["database"]))
 Base = declarative_base()
 Base.metadata.reflect(engine)
    
 df.to_sql('mytable', con = engine, if_exists = 'replace', chunksize=1000, index = False)

【问题讨论】:

    标签: python python-3.x dataframe pymysql


    【解决方案1】:

    由于您使用了参数if_exists='replace',因此您基本上删除了之前的同名表并创建了一个新表。因此,为什么时间戳字段会消失。见to_sqlpandas docs

    replace:在插入新值之前删除表。

    要保持原始表结构,请考虑删除DataFrame.to_sqlif_exists='append' 之前的所有行。

    # RUN ACTION QUERY IN TRANSACTION
    with engine.begin() as cn:
       cn.execute("DELETE FROM myTable")
    
    # APPEND TO EMPTY TABLE
    df.to_sql('mytable', con=engine, if_exists='append', chunksize=1000, index=False)
    

    注意:如果 DataFrame 数据类型和值未与数据库表对齐,请准备好处理任何错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 2015-04-11
      相关资源
      最近更新 更多