我在将数据框保存到 sqlite 数据库时遇到问题。
我有一个带有表
assignments
的sqlite数据库,其中我有employee_id
和project_id
作为复合键。
我想存储数据框,其中可能有表中已有的行(相同的
employee_id
和project_id
)。保存该数据框时,如果表中有行,则会抛出以下错误:UNIQUE constraint failed: assignments.employee_id , assignments.project_id
。我尝试使用
if_exists='append'
,但它给了我一个前面提到的错误:
以下是我的代码。
import pandas as pd
import sqlalchemy
engine = sqlalchemy.create_engine('sqlite:///my_database.db')
data = {
'employee_id': [1, 2],
'project_id': ['ABC123', 'DEF456']
}
df_new = pd.DataFrame(data)
df_new.to_sql('assignments', engine, if_exists='append', index=False)
根据官方文档,
if_exists
参数与表相关,而不是行(这确定表已存在时的行为)。
一种解决方案是从数据框中删除表中已存在的记录。像这样:
# read data from table
table_assignments_df = pd.read_sql(
'SELECT employee_id, project_id FROM assignments', conn
)
# exclude existing rows from the new data frame
df_new = df_new.loc[
~df_new['employee_id'].isin(table_assignments_df['employee_id'])
& ~df_new['project_id'].isin(table_assignments_df['project_id'])
]
# then, store new data to table
df_new.to_sql('assignments', engine, if_exists='append', index=False)