gpt4 book ai didi

python - 将数据框传递给 pandas 中的 SQL 时,如何检查记录是否存在?

转载 作者:太空宇宙 更新时间:2023-11-03 14:23:08 25 4
gpt4 key购买 nike

背景

我正在构建一个将数据从 CSV 传递到 MS SQL 数据库的应用程序。该数据库用作我企业所有此类记录(电话)的存储库。当我运行该应用程序时,它会读取 CSV 并将其转换为 Pandas 数据框,然后我使用 SQLAlchemy 和 pyodbc 将记录附加到我在 SQL 中的表中。

但是,由于我正在处理的内容的性质,通常会有我们已经导入到表中的数据。在将每条记录附加到表之前,我正在寻找一种方法来检查我的主键是否存在(我的 SQL 表和数据框中的列)。

当前代码

# 将数据帧保存到 mssql 数据库
engine = sql.create_engine('mssql+pyodbc://CTR-HV-DEVSQL3/MasterCallDb')
df.to_sql('Calls', engine, if_exists='append')

示例数据

我的 CSV 作为 pandas 数据框导入(主键是文件名,它始终是唯一的),然后传递给 MS SQL。这是我的数据框 (df):

+---+------------+-------------+
| | FileName | Name |
+---+------------+-------------+
| 1 | 123.flac | Robert |
| 2 | 456.flac | Michael |
| 3 | 789.flac | Joesph |
+---+------------+-------------+

有什么想法吗?谢谢!

最佳答案

假设您没有内存限制并且没有插入空值,您可以:

sql = "SELECT pk_1, pk_2, pk_3 FROM my_table"
sql_df = pd.read_sql(sql=sql, con=con)
df = pd.concat((df, sql_df)).drop_duplicates(subset=['pk_1', 'pk_2', 'pk_3'], keep=False)
df = df.dropna()
df.to_sql('my_table', con=con, if_exists='append')

根据应用程序,您还可以通过更改查询来减小 sql_df 的大小。

更新 - 整体更好并且可以插入空值:

sql = "SELECT pk_1, pk_2, pk_3 FROM my_table"
sql_df = pd.read_sql(sql=sql, con=con)
df = df.loc[df[pks].merge(sql_df[pks], on=pks, how='left', indicator=True)['_merge'] == 'left_only']
# df = df.drop_duplicates(subset=pks) # add it if you want to drop any duplicates that you may insert
df.to_sql('my_table', con=con, if_exists='append')

关于python - 将数据框传递给 pandas 中的 SQL 时,如何检查记录是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24915113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com