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

4bbkushb  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(330)

我正在用收集的数据建立一个数据库。我只想插入数据库中尚未插入的记录,而忽略所有重复记录。
下面是我的代码

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 我看到由于某种原因,当我得到重复项时,查询似乎不起作用。
你知道我会错过什么吗?我也很高兴有不同的方法来解决我的问题。
非常感谢你!

57hvy0tb

57hvy0tb1#

在看不到样本数据的情况下,问题可能是所有记录上的唯一标识符。如果是,请避免 SELECT * FROM 而是显式定义所有列。否则,任何唯一标识符都将与现有记录不匹配,从而导致first select中的所有记录返回 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 (删除唯一标识符)。为保留字或具有特殊字符和/或空格的列名添加了反勾号。

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;
         """

相关问题