有人知道Django是如何"模块化"的吗?我可以只使用ORM部分来获取映射到DB表的类,并知道如何从这些表中读/写吗?
如果没有,你会推荐什么作为"Hibernate的Python等价物"?
如果你喜欢Django的ORM,那么"独立"使用它非常简单; 我已经编写了几种在Web上下文之外使用Django部分的技术,你可以自由地使用它们中的任何一种(或者自己动手).
Shane上面似乎有点误导了这个以及其他一些观点 - 例如,Django 可以做多个不同的数据库,它只是不默认(你需要在使用其他东西的模型上做一个自定义管理器)而不是"主要"数据库,这是一个不太难的东西,有一些食谱漂浮在它周围).确实,Django本身并不进行连接管理/连接池,但我个人总是使用外部工具(例如pgpool
,它比任何内置于ORM中的任何东西都更难).
我建议花一些时间阅读,并可能尝试一些可能的谷歌搜索(例如,我链接到你的帖子作为"独立Django脚本"的最佳结果),以了解什么最适合你的需要和品味 - 可能是Django的ORM不适合你,你不应该使用它,如果不是,但不幸的是,有很多错误的信息在那里混淆了水域.
编辑以响应Shane:
再次,你似乎被误导:SQLAlchemy需要配置(即,告诉使用什么数据库,如何连接等),然后才能用它运行查询,那么Django需要类似配置的事实如何(通过你选择的方法 - 你不需要一个完整的Django设置文件)任何劣势?
至于多DB支持,你似乎感到困惑:支持是低水平的.查询对象 - 不是QuerySet
,但Query
它将执行的底层对象知道它连接到哪个DB,并接受DB连接作为其初始化参数之一.告诉一个模型使用一个DB而另一个模型使用另一个模型就像在管理器上设置一个方法一样简单,该方法将正确的连接信息传递给Query
.确实,没有更高级别的API,但这与"不支持"不同,与"需要自定义代码"不同(除非您认为在SQLAlchemy中显式配置多个DB,如果您需要多个,则需要DB,也是"自定义代码").
至于你是否间接使用不在的东西django.db
,那么,是什么?django.db
例如,django.utils
因为存在数据结构和其他代码位而不仅仅是ORM ,所以导入比特的事实在我个人关注的情况下是好的; 如果某些东西具有外部依赖性或者使用标准Python库而不是100%自包含,那么也可以抱怨.
简短的回答是:不,你不能将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()
调用向DB创建查询.如果这是作为视图的一部分完成的,那么它非常简单:构造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正在处理多个数据库连接支持.但它现在不存在了.
(我正在报告我的解决方案,因为我的问题是重复的)
啊好吧我明白了,并会为试图做同样事情的人发布解决方案.
此解决方案假定您要创建新模型.
首先创建一个新文件夹来存储您的文件.我们称之为"独立".在"standAlone"中,创建以下文件:
__init__.py myScript.py settings.py
显然,"myScript.py"可以命名为.
接下来,为模型创建一个目录.
我们将模型目录命名为"myApp",但要意识到这是项目中的普通Django应用程序,因此,请将其命名为您正在编写的模型集合.
在此目录中创建2个文件:
__init__.py models.py
您需要从现有的Django项目中获取manage.py的副本,或者您可以从Django安装路径中获取副本:
django\conf\project_template\manage.py
将manage.py复制到/ standAlone目录.好的,你现在应该有以下结构:
\standAlone __init__.py myScript.py manage.py settings.py \myApp __init__.py models.py
将以下内容添加到myScript.py文件中:
# settings.py from django.conf import settings settings.configure( DATABASE_ENGINE = "postgresql_psycopg2", DATABASE_NAME = "myDatabase", DATABASE_USER = "myUsername", DATABASE_PASSWORD = "myPassword", DATABASE_HOST = "localhost", DATABASE_PORT = "5432", INSTALLED_APPS = ("myApp") ) from django.db import models from myApp.models import *
并将其添加到settings.py文件中:
DATABASE_ENGINE = "postgresql_psycopg2" DATABASE_NAME = "myDatabase" DATABASE_USER = "myUsername" DATABASE_PASSWORD = "myPassword" DATABASE_HOST = "localhost" DATABASE_PORT = "5432", INSTALLED_APPS = ("myApp")
最后你的myApp/models.py:
# myApp/models.py from django.db import models class MyModel(models.Model): field = models.CharField(max_length=255)
就是这样.现在让Django管理你的数据库,在命令提示符下导航到我们的/ standalone目录并运行:
manage.py sql MyApp
你当然可以以独立的方式使用Django的各个部分.它只是一个Python模块的集合,您可以将其导入到您想要使用它们的任何其他代码中.
如果您只是在ORM方面之后,我还建议您查看SQL Alchemy.
我在没有设置文件的情况下使用django ORM.这是如何做:
在独立应用启动器文件中:
from django.conf import settings from django.core.management import execute_from_command_line #Django settings settings.configure(DEBUG=False, DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': '/path/to/dbfile', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', } }, INSTALLED_APPS = ('modelsapp',) ) if not os.path.exists('/path/to/dbfile'): sync = ['manage.py', 'syncdb'] execute_from_command_line(sync)
现在你只需要一个./modelsapp
包含a __init__.py
和a 的文件夹models.py
.为简单起见,配置使用sqlite,但它可以使用任何db后端.
文件夹结构:
./launcher.py ./modelsapp __init__.py models.py
请注意,您不必具有manage.py.在import execute_from_command_line
刚刚发现它.