将数据框加载到数据库表但保留现有的表结构
Posted
技术标签:
【中文标题】将数据框加载到数据库表但保留现有的表结构【英文标题】:Load dataframe to database table but keeping existing table structure 【发布时间】:2021-10-15 03:18:57 【问题描述】:我有想要加载到现有 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)
【问题讨论】:
【参考方案1】:由于您使用了参数if_exists='replace'
,因此您基本上删除了之前的同名表并创建了一个新表。因此,为什么时间戳字段会消失。见to_sql
pandas docs:
replace:在插入新值之前删除表。
要保持原始表结构,请考虑删除DataFrame.to_sql
和if_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 数据类型和值未与数据库表对齐,请准备好处理任何错误。
【讨论】:
以上是关于将数据框加载到数据库表但保留现有的表结构的主要内容,如果未能解决你的问题,请参考以下文章