Ошибка при попытке сохранить новую таблицу в MySQL с помощью sqlalchemy

#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' .