我发现自己每周都会学习一件或多件新事物,至少从我个人经历的角度来看是这样。因此,我认为在这里分享它是巩固一些知识、记录下来并有可能帮助其他人学习他们以前不知道的东西的好方法。
本周我了解到可以编写一个 python 脚本,该脚本可以获取数据库备份名称列表,将数据库导入 MySQL,然后启动 Flask 上下文,并按现状运行数据库报告,并且然后冲洗并重复。
也许这听起来是一个简单的概念,但事实证明,尝试使用大多数标准方法来实现这一目标具有欺骗性的挑战性。我首先简单地编写一个导入备份的脚本,然后对导入的数据运行报告,并将其放入循环中。但遗憾的是,我遇到了一个挂在第二次循环迭代上的终端,所以我开始分解可能发生的情况。
首先想到的是,我从 Flask 应用程序进行的导入导致导入被阻止,因为脚本尚未终止,因此保持与 Flask 的数据库连接的锁仍然处于活动状态,但没有错误消息告诉我发生了这种情况,我认为这是设计使然,所以我利用 Flask 的经验来合理化这很可能是这种情况。
所以,我去寻找如何简单地“取消导入”我从 Flask 导入的模块,并在 python 中遇到了 del 关键字来完成工作并再次尝试......结果却遇到了我之前坐过的那个悬挂终端。所以,一切又回到了绘图板。
我的下一个想法是,模块可能已被删除,但 Flask 应用程序上下文仍在某处运行。为了强制 Flask 应用程序上下文运行并停止在我想要的位置,我尝试了大约 2 年前在上一个任务中使用的方法,当时我需要使用 Flask 应用程序上下文异步发送电子邮件。
然后,我尝试从 for 循环中导入应用程序,然后使用 with app.app_context(): 命令强制 Flask 仅在指定的上下文中启动和停止。然后,我运行脚本,屏住呼吸地看着终端,等待一分钟左右,数据库在第一个循环中导入,然后像以前一样从第二个循环开始,然后,成功!第二次导入成功了,我得到了预期的下一步输出,表明报告已完成,我根据输出文件进行了验证。
我对结果很满意,因为这不是我以前做过的事情,所以我很高兴我能弄清楚并让它按预期工作。
您可能想知道为什么我首先要尝试这样做,这是一个很好的问题。我的任务是提取一份历史月度报告,该报告需要的数据除了数据库备份之外还没有保存在任何地方,并且无法从当前的实时数据库中收集,因此我只能使用备份来提取这些数据。这促使我学习如何管理 Flask 上下文以及数据库导入。
对于那些喜欢阅读代码的人,这就是我构建脚本的方式:
import os # for running the database import command backup_name_list = [ "backup1", "backup2" ] for backup_name in backup_name_list: # do all necessary changes or checks on the db name here command = f"mysql -u db_user_name --password='SomePassword' db_name < '/path/to/{backup_name}.sql'" os.command(command) # import the app variable to allow for the context to be created from app_module import app_variable with app_variable.app_context(): # do all Flask related imports here from app_module import relevant_app_class_or_function # run all relevant code here to build up your data from the loaded backup # remove the imported modules del relevant_app_class_or_function # remove the app variable after the context expires just to be safe del app_variable
就是这样,这就是我能够仅从数据库备份中提取历史数据的方法。
这是非常具体的,我意识到,但这也不是教程,它纯粹是我个人学习经验的一个出口,我想在这里分享,希望它成为一本有趣的读物或一个对某个地方的某人有帮助的提示。
如果您已经读到这里,我想对您的阅读表示感谢,并希望您能在我的下一篇文章中加入我。
以上是这周我学到了什么 #0的详细内容。更多信息请关注PHP中文网其他相关文章!