使用python只向sqlite数据库中插入新值的最佳方法是什么



我正在用抓取的数据构建一个数据库。我只想插入尚未在数据库中的记录,而忽略所有重复的记录。

以下是我的代码

conn = sqlite3.connect('Database.db')
df.to_sql("My_cool_data_Temp", conn, if_exists='replace', index=False)
query = "SELECT * FROM My_cool_data_Temp EXCEPT SELECT * FROM My_cool_data;"        
new_entries = pd.read_sql(query, conn)               
new_entries.to_sql("My_cool_data", conn, if_exists='append', index=False)       
conn.execute("DROP TABLE My_cool_data_Temp;")

此代码给我以下错误:

sqlite3.IntegrityError: UNIQUE constraint failed:

打印出new_entries时,我发现由于某些原因,查询似乎不起作用,因为我得到了重复项。

有什么我可能会错过的吗?我也很乐意用不同的方法来解决我的问题。

非常感谢!

在没有看到示例数据的情况下,问题可能是所有记录上的唯一标识符。如果是,请避免SELECT * FROM,而是显式定义所有列。否则,任何唯一标识符都将与现有记录不匹配,从而导致第一选择中的所有记录都返回到EXCEPT中。此外,使用插入选择并避免第二个熊猫调用:

conn = sqlite3.connect('Database.db')
df.to_sql("My_cool_data_Temp", conn, if_exists='replace', index=False) 
query = """INSERT INTO My_cool_data (Col1, Col2, Col3, ...)
SELECT Col1, Col2, Col3, ...
FROM My_cool_data_Temp
EXCEPT 
SELECT Col1, Col2, Col3, ...
FROM My_cool_data;
"""
conn.execute(query)
conn.execute("DROP TABLE My_cool_data_Temp")
conn.commit()

如果列太多(这可能表示数据库设计次优(,请使用DataFrame.columns构建SQL(删除唯一标识符(。为带有特殊字符和/或空格的保留字或列名添加的反号。

df = df.drop(["unique_id_column"], axis="columns")
cols = "`, `".join(df.columns.tolist())
query = f"""INSERT INTO My_cool_data (`{cols}`)
SELECT `{cols}`
FROM My_cool_data_Temp
EXCEPT 
SELECT `{cols}`
FROM My_cool_data;
"""

最新更新