首页 > 解决方案 > DataFrame 与 SQL Server 表比较并仅上传差异

问题描述

我有一个包含数据的 SQL 表 (table_1),我有一个读取 csf 并创建数据框的 Python 脚本。

我想将数据帧与 SQL 表数据进行比较,然后将数据帧中缺失的数据插入到 SQL 表中。

我通过 sqlquery post 和Compare pandas dataframe columns to sql table dataframe columns阅读了此比较 pandas 数据帧与 sqlite 表,但无法做到。

表和数据框具有完全相同的列。

数据框是:

import pandas as pd

df = pd.DataFrame({'userid':[1,2,3],
           'user': ['Bob', 'Jane', 'Alice'], 
                   'income': [40000, 50000, 42000]})

和 SQL 表(使用 SQLAlchemy):

userid user income
1      Bob  40000
2      Jane 42000

我想将 df 与 SQL 表进行比较,并插入用户 ID 3 Alice,以及她的所有详细信息,这是它们之间唯一缺少的值。

标签: pythonsqlsql-serverpandasdataframe

解决方案


仍然缺少一些信息来提供完整的答案。例如,您使用什么数据库引擎(SQLalchemy、sqlite3)?我假设 id 是唯一的,应该添加所有新的 id 吗?

如果您使用的是 SQLalchemy,您可能会看一下pangres,它可以从 pandas 数据帧插入和更新 SQL 数据库。但是,它确实需要数据库中具有 UNIQUE 属性的列(这意味着其中的每个条目都是唯一的,您可以在此处设置 id 列 UNIQUE)。这种方法比从数据库中加载所有数据并在 python 中进行比较具有更好的扩展性,因为只有 csf 数据在内存中,并且数据库进行比较。

如果你想在 Python 中完成这一切,一个选项是将 SQL 表加载到 pandas 中并根据 user_id 列合并数据:

import pandas as pd
df = pd.DataFrame({'userid': [0, 1, 2],'user': ['Bob', 'Jane', 'Alice'], 'income': [40000, 50000, 42000]})

sqldf = pd.read_sql_query("SELECT * FROM table_1",connection)
df = df.merge(sqldf,how='left' left_on='userid', right_on='userid')

然后你可以用新表替换旧表。编辑:我看到另一个使用合并的答案,但保留新值并仅将它们发送到数据库。这比上面的代码更干净。


推荐阅读