仅使用 Django 的数据库部分

新手上路,请多包涵

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

如果不是,您会推荐什么作为“Hibernate 的 Python 等价物”?

原文由 M. Elkstein 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 592
2 个回答

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

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

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


编辑: 为了回应 James 在其他地方的批评,我将澄清我在原始帖子中描述的内容。虽然很高兴 Django 的主要贡献者叫我出去,但我仍然认为我是对的 :)

首先,考虑需要做什么才能将 Django 的 ORM 与任何其他部分分开使用。您使用 James 描述的 方法 之一来完成 Django 的基本设置。但是其中许多方法不允许使用 syncdb 命令,这是为您的模型创建表所必需的。为此需要一个 settings.py 文件,其中的变量不仅适用于 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 多数据库连接支持正在 开发 中。但它现在不在那里。

原文由 Shane Breatnach 发布,翻译遵循 CC BY-SA 2.5 许可协议

如果您喜欢 Django 的 ORM,“独立”使用它非常简单;我已经 编写了几种在 Web 上下文之外使用 Django 部分的技术,您可以自由使用其中的任何一种(或自己使用)。

上面的 Shane 似乎在这一点和其他几点上有点误导——例如,Django 可以 做多个不同的数据库,它只是不 _默认_(你需要在使用其他东西的模型上做一个自定义管理器比“主要”数据库,不是太难的东西,并且有很多食谱)。的确,Django 本身不做连接管理/连接池,但我个人总是为此使用外部工具(例如 pgpool ,它比 ORM 内置的任何东西都更难).

我建议花一些时间阅读并可能尝试一些可能的谷歌搜索(例如,我将你链接到的帖子作为“独立 Django 脚本”的最高结果出现)以了解真正最适合你的东西需求和品味——可能是 Django 的 ORM 不适合你,如果不适合你,你不应该使用它,但不幸的是,那里有很多错误的信息,混淆了水域。

编辑以回应 Shane:

同样,您似乎被误导了:SQLAlchemy 需要先配置(即,告诉要使用什么数据库,如何连接等),然后才能使用它运行查询,那么 Django 需要类似配置的事实是怎样的(通过完成)您选择的方法——您 不需要 完整的 Django 设置文件)有什么缺点吗?

至于多数据库支持,您似乎感到困惑:支持处于低水平。查询对象——不是 QuerySet ,而是底层的 Query 将执行的对象知道它连接到哪个数据库,并接受数据库连接作为其初始化参数之一。告诉一个模型使用一个数据库而另一个模型使用另一个数据库就像在管理器上设置一种方法一样简单,该方法将正确的连接信息向下传递到 Query 。确实,没有更高级别的 API,但这与“不支持”不同,与“需要自定义代码”不同(除非你争辩说在 SQLAlchemy 中显式配置多个数据库,如果你想要多个数据库,也是“自定义代码”)。

至于你是否最终 间接 使用了不在 django.db 中的东西,那又怎样?事实上 django.db 导入位,比如说 django.utils 因为有数据结构和其他代码位,它们不仅对 ORM 有用,就我而言,这很好个人关心;如果某些东西具有外部依赖性或使用标准 Python 库而不是 100% 独立,那么人们可能会抱怨。

原文由 James Bennett 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题