将数据帧保存到带有约束的sqlite表中

问题描述 投票:0回答:1

我在将数据框保存到 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)
python pandas dataframe sqlite
1个回答
0
投票

根据官方文档

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)
© www.soinside.com 2019 - 2024. All rights reserved.