小编典典

仅使用Django的DB部分

python

有人知道Django有多“模块化”吗?我可以仅使用ORM部分来获取映射到数据库表的类并知道如何从这些表中进行读取/写入吗?

如果没有,您会推荐什么“相当于Hibernate的Python”?


阅读 228

收藏
2020-12-20

共1个答案

小编典典

简短的答案是:不,您不能将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_exception
reset_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多个数据库连接的支持正在制定上。但是现在不存在。

2020-12-20