#python #mysql #pandas #sqlalchemy
#python #mysql #pandas #sqlalchemy
Вопрос:
Привет, у кого-нибудь есть идеи по устранению неполадок для решения этой проблемы?
У меня стандартное соединение python-sql на моем локальном компьютере:
from sqlalchemy import create_engine
engine = create_engine("mysql pymysql://root:*******@localhost/my_DB")
con = engine.connect()
эта база данных состоит из более чем 200 таблиц, в которых я храню информацию о запасах / рынках, и мне нужно обновлять ее ежедневно, для этого я обычно создаю цикл по всем таблицам для извлечения актуальной информации из yahoo_finance с помощью pandas datareader.
После загрузки в новый DF я использую
df_new.to_sql(name = stock_ticker, con = con, if_exists = 'replace', index = False)
чтобы сохранить новую таблицу в моей базе данных.
Приведенный выше код отлично работает, когда я выполняю один за другим, но когда я пытаюсь реализовать ту же идею в цикле, он просто ломается, иногда в самом первом экземпляре цикла:
for stock in Stocks:
df_new = yahoo_quote(stock)
df_new.to_sql(name = stock_ticker, con = con, if_exists = 'replace', index = False)
Моей первой мыслью было, что каким-то образом я выгружал свой machine / sql с таким количеством вызовов, поэтому я попытался добавить time.sleep (5) и убедиться, что я удалил всю информацию из памяти в каждом экземпляре, но, похоже, ничего из этого не работает. И, как я уже сказал, иногда компьютер просто ломается в самом первом цикле.
Под «перерывом» я подразумеваю, что он просто продолжает работать вечно без сохранения таблицы, обычно для сохранения таблицы требуется чуть меньше 1 секунды, но когда это происходит, я могу оставить его запущенным на 10 минут, и он все равно не сохранит его.
Комментарии:
1. Возможно, попробуйте использовать диспетчер контекста внутри вашего
for stock in Stocks:
цикла, как это .2. Если я правильно понял, это создало бы (начало) новое соединение в каждом цикле, а не просто использовало глобальное для всех… Я попробую! Спасибо
Ответ №1:
if_exists= 'replace'
вариант — удалить таблицу перед вставкой новых значений. Ссылка на API
ваш код повторяет удаление и создает ту же таблицу в цикле.
Если вы хотите заменить все данные, в первый раз вызовите df_new.to_sql
set if_exists= 'replace'
, а во второй раз вызовите set if_exists= 'append'
.