【问题标题】:Error trying to save new table to MySQL with sqlalchemy尝试使用 sqlalchemy 将新表保存到 MySQL 时出错
【发布时间】:2021-01-03 10:41:44
【问题描述】:

您好,有人有解决此问题的故障排除想法吗?

我在本地机器上有一个标准的 python-sql 连接:

from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:*******@localhost/my_DB")

con = engine.connect()

这个数据库由 200 多个表组成,我在其中存储股票/市场信息,我需要每天更新它,为此我通常会在所有表中构建一个循环,以使用 pandas 数据阅读器从 yahoo_finance 获取最新信息.

一旦加载到我使用的新 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)

我的第一个想法是,不知何故,我的机器/sql 有这么多的调用,所以我尝试添加一个 time.sleep(5) 并确保我从每个实例的内存中删除了所有信息,但没有一个这似乎有效。而且,正如我所说,有时计算机会在第一个循环中中断。

我所说的“中断”是指它只是一直运行而不保存表,通常保存表需要不到 1 秒的时间,但是当这种情况发生时,我可以让它运行 10 分钟以上,它仍然获胜不要保存它。

【问题讨论】:

  • 也许可以尝试在 for stock in Stocks: 循环中使用上下文管理器,例如 this
  • 如果我理解正确,它将在每个循环上创建(开始)一个新连接,而不仅仅是使用全局连接...我会试一试!谢谢

标签: python mysql pandas sqlalchemy


【解决方案1】:

if_exists= 'replace' 选项是在插入新值之前删除表。 API reference
您的代码重复 drop 并在循环中创建相同的表。
如果要替换所有数据,第一次调用df_new.to_sqlsetif_exists= 'replace',第二次调用setif_exists= 'append'

【讨论】:

    猜你喜欢
    • 2021-01-10
    • 2015-10-11
    • 2021-10-13
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2015-04-13
    相关资源
    最近更新 更多