栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用SQLAlchemy从应用程序正确分离模型的Python方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用SQLAlchemy从应用程序正确分离模型的Python方法

现在,你已使用大致等同于“

Application Factory
”模式(由Flask文档称为)的方式设置了应用程序。这是Flask的想法,而不是Python。它具有一些优点,但也意味着你需要做一些事情,例如使用
init_app
方法而不是SQLAlchemy构造函数来初始化SQLAlchemy对象。这样做没有什么“错”,但是这意味着你需要像
create_all()
在应用程序上下文中那样运行方法,而如果你尝试在该
main()
方法中运行它,那么当前不是。

有几种方法可以解决此问题,但是要由你决定要哪种方法(没有正确的答案):

不要使用Application Factory模式
这样,你无需在函数中创建应用程序。相反,你将其放在某个地方(如中的

project/__init__.py
)。你的
project/__init__.py
文件可以导入models包,而models包可以app从导入
project
。这是一个循环引用,但只要没关系app对象在所创建的
project
包之前,首先model尝试导入app从
package
。有关示例的信息,请参见“ 大型应用程序模式”中的Flask文档,在该示例中,你可以将程序包拆分为多个程序包,但仍然可以使这些其他程序包app通过循环引用来使用该对象。文档甚至说:

每个Python程序员都讨厌它们,但我们只是添加了一些:循环导入。[…]一般而言,这是个坏主意,但在这里确实可以。

如果执行此操作,则可以更改

Models/__init__.py
文件以SQLAlchemy使用构造函数中对应用程序的引用来构建对象。这样,你可以使用对象的
create_all()
drop_all()
方法SQLAlchemy,如Flask-SQLAlchemy的文档中所述。

保持你现在的状态,但是构建一个request_context()
如果继续进行现有操作(在函数中创建应用程序),则需要SQLAlchemy在Models包中构建对象,而无需将该app对象用作构造函数的一部分(已完成)。在你的主要方法中,更改…

db = SQLAlchemy(app)

…到…

db.init_app(app)

然后,你需要将create_all()方法移至应用程序上下文内部的函数中。在项目的早期阶段执行此操作的常用方法是利用before_first_request()装饰器…。

app = Flask(...)@app.before_first_requestdef initialize_database():    db.create_all()

Flask处理第一个请求之前,将运行“ initialize_database”方法。你还可以通过使用app_context()方法在任何时候执行此操作:

app = Flask(...)with app.app_context():    # This should work because we are in an app context.    db.create_all()

意识到如果你将继续使用Application Factory模式,那么你应该真正了解应用程序上下文是如何工作的。起初可能会造成混淆,但有必要认识到诸如“应用程序未在数据库实例上注册且没有应用程序绑定到当前上下文”之类的错误。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/379262.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号