只使用Django的数据库部分

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

如果不是的话,你会推荐什么“Hibernate的Python等价物”?

简短的回答是:不,你不能从Django单独使用Django ORM。

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

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


编辑:为了回应詹姆斯在别处的批评,我将澄清我在原来的post中描述的内容。 虽然令人欣慰的是Django主要贡献者已经打电话给我,但我仍然认为我是对的:)

首先,考虑将Django的ORM与其他任何部分分开使用需要做些什么。 您使用James描述的方法之一来做Django的基本设置。 但是其中一些方法不允许使用syncdb命令,这是为您的模型创build表所必需的。 这需要一个settings.py文件,variables不仅包含DATABASE_* ,还包括INSTALLED_APPLICATIONS和所有models.py文件的正确path。

在不使用settings.py的情况下,可以将自己的解决scheme推出使用syncdb ,但需要一些Django的高级知识。 当然,你不需要使用syncdb ; 这些表格可以独立于模型创build。 但是这是ORM的一个方面,除非你付出一些努力才能设置。

其次,考虑如何使用标准的Model.objects.filter()调用来创build对数据库的查询。 如果这是作为视图的一部分来完成的话,那么很简单:构造QuerySet并查看实例。 例如:

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

好,简单而干净。 现在,如果没有Django的请求/响应链接系统的拐杖,您需要初始化数据库连接,进行查询,然后closures连接。 所以上面的例子变成:

 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() 

数据库连接pipe理也可以通过Django信号完成。 以上所有都是在django / db / init .py中定义的。 其他的ORM也有这样的连接pipe理,但是你不需要挖掘他们的源头来找出如何去做。 SQL Alchemy的连接pipe理系统logging在教程和其他地方。

最后,需要记住的是,数据库连接对象始终是当前线程的本地对象,根据您的需求,这可能会或可能不会限制您。 如果你的应用程序不像Django那样是无状态的,但是持久的,你可能会遇到线程问题。

总之,这是一个意见问题。 在我看来,Django的ORM与框架分离的限制和所需的设置都是过多的责任。 在其他地方有专门为图书馆使用而devise的完全可行的专用ORM解决scheme。 Django的不是。

不要以为所有的上面都显示我不喜欢Django及其所有的工作,我真的很喜欢Django! 但是我对于它的function是否现实以及作为一个ORM库不是其中之一。

PS多个数据库连接支持正在进行中。 但现在不在了。

如果你喜欢Django的ORM,使用它“独立”是非常简单的。 我已经写了几个使用Django的部分外部Web上下文的技术 ,你可以自由地使用它们中的任何一个(或滚动你自己的)。

上面的Shane似乎有点误导了这个以及其他几点 – 例如,Django 可以做多个不同的数据库,它只是不默认的 (你需要做一个自定义pipe理器的模型,使用其他的东西比“主”数据库,这不是很难,有食谱漂浮在它周围)。 的确,Django本身并没有进行连接pipe理/连接池,但个人而言,我总是使用外部工具(例如, pgpool ,比ORM中内置的任何东西都更难)。

我build议花一些时间阅读,可能会尝试一些可能的谷歌search(例如,我链接你的post来作为“独立的Django脚本”的最高结果),以得到什么将最适合你的感觉需求和口味 – 可能是Django的ORM不适合你,如果不是,你不应该使用它,但不幸的是,有很多错误的信息在那里混浊的水域。

编辑回应谢恩:

再一次,你似乎错误的信息:SQLAlchemy需要configuration(即告诉什么数据库使用,如何连接等),然后才能运行查询,那么怎么样的事实,Django需要类似的configuration(通过完成你select的方法 – 你不需要有一个完整的Django设置文件)的任何缺点?

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

至于你是否间接地使用了不在django.db东西,那么是什么呢? 事实上, django.db导入比如django.utils因为有些数据结构和其他一些代码对于不仅仅是一个ORM是有用的。 有人可能会抱怨,如果有东西有外部依赖或使用标准的Python库,而不是100%自包含。

你当然可以用独立的方式使用Django的各个部分。 它毕竟只是一个Python模块的集合,您可以将其导入到任何其他您希望使用的代码中。

我也build议看看SQL炼金术,如果你只是在ORM方面的事情。

(我报告我的解决scheme,因为我的问题说是重复的)

嗯,我想通了,并会发布解决scheme,任何人试图做同样的事情。

此解决scheme假定您要创build新的模型。

首先创build一个新的文件夹来存储您的文件。 我们将其称为“独立”。 在“standalone”中,创build以下文件:

 __init__.py myScript.py settings.py 

显然“myScript.py”可以被命名为任何东西。

接下来,为您的模型创build一个目录。

我们将我们的模型目录命名为“myApp”,但是要意识到这是一个正常的项目中的Django应用程序,因此,将它命名为您正在编写的模型的集合。

在这个目录下创build2个文件:

 __init__.py models.py 

您将需要从现有的Django项目中获取manage.py的副本,或者您可以从Django安装path获取副本:

 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) 

就是这样。 现在让Djangopipe理你的数据库,在命令提示符下导航到我们的/ standalone目录并运行:

 manage.py sql MyApp 

我推荐SQLAlchemy 。 它应该做所有的ORM的东西,以及基本的SQL的东西。

我正在使用没有设置文件的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) 

现在只需要一个包含__init__.pymodels.py./modelsapp文件夹。 为了简单起见,config使用sqlite,但是它可以使用任何的db后端。

文件夹结构:

 ./launcher.py ./modelsapp __init__.py models.py 

请注意,您不必拥有manage.py。 import execute_from_command_line只是find它。

看看django-standalone ,这个设置很简单。

我也发现这个博客条目相当有用。

这个例子非常简单。 我已经有一个名为thab的django应用程序运行。 我想在自由站立的python脚本中使用django orm,并使用与我用于web编程相同的模型。 这里是一个例子:

 # nothing in my sys.path contains my django project files import sys sys.path.append('c:\\apython\\thab') # location of django app (module) called thab where my settings.py and models.py is # my settings.py file is actualy in c:\apython\thab\thab from thab import settings as s # need it because my database setting are there dbs = s.DATABASES from django.conf import settings settings.configure(DATABASES=dbs) # configure can only be called once from thab.models import * boards = Board.objects.all() print 'all boards:' + str(boards) # show all the boards in my board table 

也许我的回答迟到了,但迟到比从未好。

试试这个简单的包: https : //github.com/serglopatin/django-models-standalone

如何使用:

  1. 下载

  2. 安装

     python setup.py install 
  3. 创build项目

     django-models-standalone startproject myproject 
  4. 调整文件settings.py(DATABASES)和models.py,然后在未创build表时进行迁移

  5. 在应用程序中使用djando模型(example.py)

 import django from django.conf import settings from backend_mock.admin import settings as s settings.configure( DATABASES=s.DATABASES, INSTALLED_APPS=('backend_mock.admin.mocker', ) ) django.setup() 

看看这个,它的工作django版本gte 1.8.x

这是在Django> 1.4中为我工作的

假设你的独立脚本是你的django项目DIR。

只需将其复制到conf.py文件中即可(您可以指定任何名称)。

 import os import sys import django BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) #sys.path.append('c:\\apython\\thab') # location of django app (module) called thab where my settings.py and models.py is # my settings.py file is actualy in c:\apython\thab\thab from elsaserver import settings as s # need it because my database setting are there dbs = s.DATABASES from django.conf import settings settings.configure( DATABASES=dbs, INSTALLED_APPS=('core.apps.CoreConfig', )) #add all the apps you need here django.setup() 

然后在你的Python脚本中导入conf.py。

这是项目结构:

 mydjangoproject | > app1 > core > app2 > standalone | | __init__.py | | conf.py | | myscript.py > manage.py