将 pandas 中的数据插入 sql 数据库 - 键不适合列

Insert data from pandas into sql db - keys doesn't fit columns

我有一个包含大约 10 列的数据库。有时我需要插入一行,其中只有 3 个必需的列,其余的不在 dic.

要插入的数据是一个名为 row 的字典: (此插入是为了避免重复)

row = {'keyword':'abc','name':'bds'.....}
df = pd.DataFrame([row]) # df looks good, I see columns and 1 row.
engine  = getEngine()
connection = engine.connect()
df.to_sql('temp_insert_data_index', connection, if_exists ='replace',index=False)
result = connection.execute(('''
        INSERT INTO {t} SELECT * FROM temp_insert_data_index 
        ON CONFLICT DO NOTHING''').format(t=table_name))
connection.close()

问题:当我没有 row(dic) 中的所有列时,它将插入 dic 字段 按顺序 (一个 3 键 dic 将被插入 到前 3 列 )而不是正确的列。 (我希望 dic 中的键适合数据库列)

为什么?

考虑明确命名要插入到 INSERT INTOSELECT 子句中的列,这是 SQL 追加查询的最佳做法。这样做,动态查询应该适用于所有列或列的子集。下面使用 F-string(可用 Python 3.6+)对更大 SQL 查询的所有插值:

# APPEND TO STAGING TEMP TABLE
df.to_sql('temp_insert_data_index', connection, if_exists='replace', index=False)

# STRING OF COMMA SEPARATED COLUMNS
cols = ", ".join(df.columns)

sql = (
    f"INSERT INTO {table_name} ({cols}) "
    f"SELECT {cols} FROM temp_insert_data_index "
    "ON CONFLICT DO NOTHING"
)
result = connection.execute(sql)
connection.close()