【问题标题】:What is the best way to only insert new values into a sqlite database with python?仅使用 python 将新值插入 sqlite 数据库的最佳方法是什么?
【发布时间】:2021-07-10 23:58:25
【问题描述】:

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

以下是我的代码

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 我看到由于某种原因查询似乎不起作用,因为我得到了重复。

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

非常感谢!

【问题讨论】:

  • 发布表定义和示例数据以澄清您的问题。

标签: python sql pandas dataframe sqlite


【解决方案1】:

如果没有看到示例数据,问题可能是所有记录上的唯一标识符。如果是这样,请避免使用SELECT * FROM,而是明确定义 all 列。否则,任何唯一标识符都不会与现有记录匹配,从而导致第一次选择中的所有记录返回 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;
         """

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2010-10-20
    相关资源
    最近更新 更多