Sqlalchemy: добавьте в таблицу mysql новые строки из кадра данных pandas, если они еще не существуют в таблице - PullRequest
0 голосов
/ 08 мая 2019

Я создал таблицу, вставляющую данные, извлеченные из API, и сохраняющую их в кадре данных pandas с использованием sqlalchemy.Мне нужно будет каждые 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()

Конечная цель - вставить в таблицу только те несуществующие данные, которые поступают из API

.

1 Ответ

0 голосов
/ 08 мая 2019

Вы можете перенести результаты, уже находящиеся в базе данных, в новый фрейм данных, а затем сравнить два фрейма данных. После этого вы вставляете только строки, которых нет в таблице. Не зная формат вашей таблицы или данных, я просто использую здесь общий оператор 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.from_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()

Вам также необходимо изменить if_exists на append, поскольку при значении replace он удаляет все значения в таблице и заменяет их значениями в кадре данных pandas.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...