Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在将数据帧传递给数据库中的SQL时,如何检查记录是否存在? 背景_Python_Sql Server_Csv_Pandas_Sqlalchemy - Fatal编程技术网

Python 在将数据帧传递给数据库中的SQL时,如何检查记录是否存在? 背景

Python 在将数据帧传递给数据库中的SQL时,如何检查记录是否存在? 背景,python,sql-server,csv,pandas,sqlalchemy,Python,Sql Server,Csv,Pandas,Sqlalchemy,我正在构建一个将数据从CSV传递到MS SQL数据库的应用程序。该数据库正被用作我的企业所有此类记录(电话)的存储库。当我运行应用程序时,它读取CSV并将其转换为Pandas数据帧,然后我使用SQLAlchemy和pyodbc将记录附加到SQL中的表中 然而,由于我正在处理的内容的性质,经常有我们已经导入到表中的数据。在将每条记录追加到表之前,我正在寻找一种方法来检查主键是否存在(SQL表和dataframe中的一列) 现行代码 #将数据帧保存到mssql数据库 引擎=sql。创建引擎('mss

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

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

现行代码
#将数据帧保存到mssql数据库
引擎=sql。创建引擎('mssql+pyodbc://CTR-HV-DEVSQL3/MasterCallDb')
df.to_sql('Calls',engine,如果_exists='append')

样本数据 我的CSV作为数据帧导入(主键是FileName,它总是唯一的),然后传递给MS SQL。这是我的数据帧(df):


有什么想法吗?谢谢

如果您遍历行,然后在每次用于键值文件名的迭代中不再添加它,该怎么办

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

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')

找到解决方案了吗?我用SQL中的存储过程逻辑解决了这个问题。基本上,我是这样做的:[,然后为我导入的每个文件运行它。虽然效率不高,但它可以工作。@KidSudi
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')