将数据框加载到数据库表但保留现有的表结构

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_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 数据类型和值未与数据库表对齐,请准备好处理任何错误。

【讨论】:

以上是关于将数据框加载到数据库表但保留现有的表结构的主要内容,如果未能解决你的问题,请参考以下文章

删除 hive 分区外部表但保留分区

Laravel Artisan Migrate 命令创建表但不将每个迁移文件填充到迁移表

Pandas to_sql 创建表但不插入数据

保留几个组合框(列表框)的最佳表结构是啥

为 Laravel 映射现有的数据库表

尝试将字段插入数据库表但出现错误“找不到对象”