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

仅使用Django的DB部分

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

仅使用Django的DB部分

简短的答案是:不,您不能将Django ORM与Django分开使用。

长答案是:是的,如果您愿意随同加载Django的大部分内容,则可以。例如,当对Django的请求发生时,将打开Django使用的数据库连接。发送信号时会发生这种情况,因此您表面上可以发送此信号以打开连接而无需使用特定的请求机制。另外,您需要为Django项目设置各种应用程序和设置。

最终,这可能不值得您花时间。SQL Alchemy是一个相对知名的Python
ORM,它实际上比Django强大,因为它支持多个数据库连接,连接池和其他好东西。


编辑: 针对詹姆斯在其他地方的批评,我将澄清我在原始帖子中所描述的内容。虽然很高兴有一位主要的Django贡献者叫我出来,但我仍然认为我是对的:)

首先,请考虑将Django的ORM与其他任何部分分开使用需要做什么。您使用James描述的方法之一来进行Django的基本设置。但是,其中许多方法都不允许使用

syncdb
命令,而该命令是为模型创建表所必需的。为此需要一个settings.py文件,它不仅具有变量for
DATAbase_*
,还
INSTALLED_APPLICATIONS
具有指向所有models.py文件的正确路径。

您可以滚动使用自己的解决方案,

syncdb
而无需使用settings.py,但需要具备Django的一些高级知识。当然,您不需要使用
syncdb
;
可以独立于模型创建表。但这是ORM的一个方面,除非您进行一些设置,否则它是不可用的。

其次,考虑如何使用标准

Model.objects.filter()
调用对数据库创建查询。如果这是作为视图的一部分完成的,则非常简单:构造
QuerySet
和查看实例。例如:

tag_query = Tag.objects.filter( name='stackoverflow' )if( tag_query.count() > 0 ):    tag = tag_query[0]    tag.name = 'stackoverflowed'    tag.save()

不错,简单干净。现在,在没有Django请求/响应链系统的麻烦的情况下,您需要初始化数据库连接,进行查询,然后关闭连接。因此,上面的示例变为:

from django.db import reset_queries, close_connection, _rollback_on_exceptionreset_queries()try:    tag_query = Tag.objects.filter( name='stackoverflow' )    if( tag_query.count() > 0 ):        tag = tag_query[0]        tag.name = 'stackoverflowed'        tag.save()except:    _rollback_on_exception()finally:    close_connection()

数据库连接管理也可以通过Django信号来完成。以上所有内容都在django / db / init
.py中定义。其他ORM也具有这种连接管理,但是您无需深入研究其源代码即可了解如何进行连接管理。SQL
Alchemy的连接管理系统记录在教程和其他地方。

最后,您需要记住,数据库连接对象始终在当前线程本地,这可能会或可能不会限制您,具体取决于您的要求。如果您的应用程序不是非状态的(如Django),而是持久的,则可能会遇到线程问题。

总之,这是一个见解。我认为,Django
ORM与框架分离的局限性和所需的设置都实在太大了。在其他地方有专门针对图书馆使用的完全可行的专用ORM解决方案。Django的不是。

不要以为以上所有内容都表明我不喜欢Django及其所有功能,我确实非常喜欢Django!但是我对它的功能是很现实的,成为ORM库并不是其中之一。

PS多个数据库连接的支持正在制定上。但是现在不存在。



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

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

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