将 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 INTO
和 SELECT
子句中的列,这是 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()
我有一个包含大约 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 INTO
和 SELECT
子句中的列,这是 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()