Python Sqlalchemy:从pandas dataframe向mysql表中添加新行,如果它们没有';表中不存在

Python Sqlalchemy:从pandas dataframe向mysql表中添加新行,如果它们没有';表中不存在,python,pandas,sqlalchemy,Python,Pandas,Sqlalchemy,我创建了一个表,插入从api获取的数据,并使用sqlalchemy将其存储到pandas数据帧中。 我需要每4小时查询一次api以获取新数据。 问题是api不仅会返回新数据,还会返回mysql中已经导入的旧数据 如何将新数据导入mysql表 我从api中检索数据,将数据存储到pandas对象中,创建到mysql db的连接,并创建一个新表 import requests import json from pandas.io.json import json_normalize myToken =

我创建了一个表,插入从api获取的数据,并使用sqlalchemy将其存储到pandas数据帧中。 我需要每4小时查询一次api以获取新数据。 问题是api不仅会返回新数据,还会返回mysql中已经导入的旧数据 如何将新数据导入mysql表

我从api中检索数据,将数据存储到pandas对象中,创建到mysql db的连接,并创建一个新表

import requests
import json
from pandas.io.json import json_normalize
myToken = 'xxx'
myUrl = 'somewebsite'
head = {'Authorization': 'token {}'.format(myToken)}
response = requests.get(myUrl, headers=head)
data=response.json()
#print(data.dumps(data, indent=4, sort_keys=True))
results=json_normalize(data['results'])
results.rename(columns={'datastream.name': 'datastream_name',                    
                        'datastream.url':'datastream_url',
                        'datastream.datastream_type_id':'datastream_id',
                        'start':'error_date'}, inplace=True)

results_final=pd.DataFrame([results.datastream_name,
                            results.datastream_url, 
                            results.error_date, 
                            results.datastream_id,
                            results.message,
                            results.type_label]).transpose()

from sqlalchemy import create_engine
from sqlalchemy import exc
engine = create_engine('mysql://usr:psw@ip/schema')
con = engine.connect()
results_final.to_sql(name='error',con=con,if_exists='replace')
con.close()

最终目标是将api中不存在的数据插入表中,您可以将数据库中已有的结果拉入一个新的数据框,然后比较这两个数据框。之后,只插入表中没有的行。不知道您的表或数据的格式,我只是在这里使用一个通用的
SELECT
语句

from sqlalchemy import create_engine
from sqlalchemy import exc
engine = create_engine('mysql://usr:psw@ip/schema')
con = engine.connect()
sql = "SELECT * FROM table_name"
old_results = pd.read_sql(sql, con)
df = pd.merge(old_results, results_final, how='outer', indicator=True)
new_results = df[df['_merge']=='right_only'][results_final.columns]
new_results.to_sql(name='error',con=con,if_exists='append')
con.close()
如果存在,还需要将
更改为
append
,因为设置为
replace
会删除表中的所有值,并用数据框中的值替换它们