如何使用 pandas.to_sql 但仅在行尚不存在时添加行

Ano*_*ous 12 python mysql pandas pandas-to-sql

我对 python 有一些经验,但对 SQL 很陌生,并尝试使用 pandas.to_sql 将表数据添加到我的数据库中,但是当我添加时,我希望它在追加之前检查数据是否存在

这是我的 2 个数据框

>>> df0.to_markdown()
|    |   Col1 |   Col2 |
|---:|-------:|-------:|
|  0 |      0 |     00 |
|  1 |      1 |     11 |

>>> df1.to_markdown()
|    |   Col1 |   Col2 |
|---:|-------:|-------:|
|  0 |      0 |     00 |
|  1 |      1 |     11 |
|  2 |      2 |     22 |
Run Code Online (Sandbox Code Playgroud)

所以这里我使用pandas to_sql

>>> df0.to_sql(con=con, name='test_db', if_exists='append', index=False)
>>> df1.to_sql(con=con, name='test_db', if_exists='append', index=False)
Run Code Online (Sandbox Code Playgroud)

在这里我检查数据库文件中的数据

>>> df_out = pd.read_sql("""SELECT * FROM test_db""", con)
>>> df_out.to_markdown()
|    |   Col1 |   Col2 |
|---:|-------:|-------:|
|  0 |      0 |      0 |
|  1 |      1 |     11 |
|  2 |      0 |      0 | # Duplicate
|  3 |      1 |     11 | # Duplicate
|  4 |      2 |     22 | 
Run Code Online (Sandbox Code Playgroud)

但我希望我的数据库看起来像这样,所以我不想将重复的数据添加到我的数据库中

|    |   Col1 |   Col2 |
|---:|-------:|-------:|
|  0 |      0 |      0 |
|  1 |      1 |     11 |
|  3 |      2 |     22 | 
Run Code Online (Sandbox Code Playgroud)

我可以设置任何选项或添加一些代码行来实现这种情况吗?

谢谢你!

编辑:有一些 SQL 代码仅提取唯一数据,但我想做的是首先不要将数据添加到数据库中

小智 7

不要使用 to_sql 一个简单的查询就可以工作

query = text(f""" INSERT INTO test_db VALUES {','.join([str(i) for i in list(df0.to_records(index=False))])} ON CONFLICT ON CONSTRAINT test_db_pkey DO NOTHING""")

self.engine.connect().execute(query)
Run Code Online (Sandbox Code Playgroud)

对于每个 DataFrame 将 df0 更改为 df1

请点击这些链接以获得更好的理解


Bar*_*t77 -2

将此代码添加到您的函数中

remove_duplicate = 'EXEC remove_duplicate'
cursor.execute(remove_duplicate)
cursor.commit()
Run Code Online (Sandbox Code Playgroud)

并在您的数据库中创建过程:

    CREATE PROCEDURE remove_duplicate AS
BEGIN
;WITH duplicates as (SELECT col1, col2,
                    ROW_NUMBER() OVER (PARTITION BY col1, col2, ORDER BY col1) AS number_of_duplicates
    FROM dbo.table)
    DELETE FROM duplicates WHERE number_of_duplicates > 1

END
go
Run Code Online (Sandbox Code Playgroud)