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)
| 归档时间: |
|
| 查看次数: |
11486 次 |
| 最近记录: |