lal*_*lal 5 python sqlalchemy pandas
我创建了一个表,插入从 api 获取的数据并使用 sqlalchemy 存储到 pandas 数据框中。我需要每 4 小时查询一次 api,以获取新数据。问题是,API 不仅会返回新数据,还会返回已导入 mysql 的旧数据,我如何才能将新数据导入 mysql 表中
我从 api 检索数据,将数据存储到 pandas 对象中,创建与 mysql 数据库的连接并创建一个全新的表。
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()
Run Code Online (Sandbox Code Playgroud)
最终目标是将来自 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()
Run Code Online (Sandbox Code Playgroud)
您还需要更改if_exists为,append因为设置为replace它会删除表中的所有值并将它们替换为 pandas 数据框中的值。
| 归档时间: |
|
| 查看次数: |
1881 次 |
| 最近记录: |