python - 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,以及她的所有详细信息,这是它们之间唯一缺少的值。
解决方案
仍然缺少一些信息来提供完整的答案。例如,您使用什么数据库引擎(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')
然后你可以用新表替换旧表。编辑:我看到另一个使用合并的答案,但保留新值并仅将它们发送到数据库。这比上面的代码更干净。
推荐阅读
- ios - iOS 确保 iPhone SE 上的 UINavigationBar 中的栏按钮项显示为全尺寸
- node.js - 获得连续的“请求率很大”错误
- sql - 无法调用我的光标的输出以在输出中使用
- c - 与 Go 之间的 C 指针转换
- azure - Azure SSL 证书标签
- mysql - 我有一个返回太多行的连接
- excel - 将用户表单文本值输入到右侧的下一个空单元格
- javascript - HTML 中的不同类取决于屏幕大小
- google-apps-script - 将来自 Google 表单响应的信息添加到 Google 文档表中的新行
- excel - 将错误 Excel 粘贴到 Powerpoint VBA