to_sql 如果不存在则添加列(sqlalchemy mysql)

Dmi*_*kin 5 sqlalchemy pandas

同时将行附加到 mysql 表与熊猫to_sql一样

df.to_sql('table_name', engine, if_exists='append')
Run Code Online (Sandbox Code Playgroud)

附加df可能包含一些新列,在 mysql 中不存在table_name

所以,我被 pymysql.err.InternalError 触发了:

InternalError: (pymysql.err.InternalError) (1054, "Unknown column 'new_columns' in 'field list'")
Run Code Online (Sandbox Code Playgroud)

在尝试捕获此异常以添加new column到 mysql 表时,pymysql.err.InternalError由于某种原因我无法捕获异常,因此我尝试以一种奇怪的方式执行BaseException以下操作:

     while True:
         try:
             df.to_sql(table_name, engine, if_exists='append')
         except BaseException as e:
             b = e.args
            missing_column = b[0].split('(pymysql.err.InternalError) (1054, "Unknown column \'')[1].split(' in \'field list\'")')[0].replace("'",'')
            with sql.engine.connect() as con:
                con.execute(f'ALTER TABLE {table_name} ADD COLUMN {missing_column} TEXT;')
        else: break
Run Code Online (Sandbox Code Playgroud)

这个解决方案既丑陋又不稳定,所以我很感激你的建议!

BSP*_*BSP 0

您可以在向其追加新数据之前检查 sql 表列:

import pandas as pd

target_name = "your_table"
target_cols = pd.read_sql_query(f"select * from {target_name} limit 1;").columns.tolist()
your_cols = df.columns.tolist()

if set(your_cols) - set(target_cols) == set():
# APPEND OPERATION...
else:
# NEW COL OPERATION...
 
Run Code Online (Sandbox Code Playgroud)