Python 仅使用Django的DB部分

Python 仅使用Django的DB部分,python,django,orm,Python,Django,Orm,有人知道Django有多“模块化”吗?我可以只使用ORM部分来获取映射到DB表的类,并知道如何从这些表读/写吗 如果没有,您会推荐什么作为“Hibernate的Python等价物”您当然可以以独立的方式使用Django的各个部分。毕竟,它只是一个Python模块的集合,您可以将其导入到您想要使用它们的任何其他代码中 我还建议您只关注ORM方面的内容。我建议。它应该做所有的ORM工作,以及基本的SQL工作。简单的回答是:不,不能将Django ORM与Django分开使用 答案很长:是的,如果您愿

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


如果没有,您会推荐什么作为“Hibernate的Python等价物”

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


我还建议您只关注ORM方面的内容。

我建议。它应该做所有的ORM工作,以及基本的SQL工作。

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

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

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


编辑:针对詹姆斯在其他地方的批评,我将澄清我在原始帖子中描述的内容。尽管令人欣慰的是,一位Django的主要撰稿人把我叫了出来,但我仍然认为我是对的:)

首先,考虑使用Django的ORM与其他部分分开需要做什么。您可以使用James描述的其中一种方法来完成Django的基本设置。但是这些方法中有许多不允许使用
syncdb
命令,这是为您的模型创建表所必需的。为此需要一个settings.py文件,其中不仅包含
数据库
的变量,还包括
安装的应用程序
,以及所有models.py文件的正确路径

您可以在不使用settings.py的情况下使用自己的解决方案来使用
syncdb
,但它需要一些Django的高级知识。当然,您不需要使用
syncdb
;这些表可以独立于模型创建。但这是ORM的一个方面,除非您在设置中投入一些精力,否则它是不可用的

第二,考虑如何使用标准<代码>模型.Objs.Fielter()/<代码>调用来创建对数据库的查询。如果这是作为视图的一部分完成的,则非常简单:构造

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信号完成。上述所有内容均在中定义。其他的orm也有这种连接管理,但是您不需要深入研究它们的源代码来了解如何实现。SQL Alchemy的连接管理系统记录在和其他地方

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

总之,这是一个意见问题。在我看来,Django的ORM与框架分离的局限性和所需的设置都是一个很大的负担。其他地方有完全可行的专用ORM解决方案可供图书馆使用。Django的不是

不要以为上面所有的这些都表明我不喜欢Django及其工作原理,我真的非常喜欢Django!但我对它的功能很现实,作为一个ORM库并不是其中之一


另外,正在启用多数据库连接支持。但是它现在不在那里。

如果你喜欢Django的ORM,那么“独立”使用它非常简单;我有,你可以自由使用其中任何一种(或者自己滚)

上面的Shane似乎在这一点和其他几点上有点误传——例如,Django可以处理多个不同的数据库,它只是没有默认设置(您需要在使用“main”DB以外的其他东西的模型上执行自定义管理器,这些东西不太难,而且有很多方法可以使用)。Django本身确实不做连接管理/连接池,但就我个人而言,我总是使用外部工具(例如,
pgpool
,这比ORM内置的任何工具都更难实现)

我建议花些时间阅读并尝试一些可能的谷歌搜索(例如,我链接到你的帖子是“独立Django脚本”的最佳搜索结果),以了解什么最适合你的需求和口味——可能Django的ORM不适合你,如果不适合你,你不应该使用它,但不幸的是,有很多错误的信息在那里,浑浊的水域

编辑以回应Shane:

# 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 *
    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
from django.db import models

class MyModel(models.Model):
     field = models.CharField(max_length=255)
同样,您似乎得到了错误的信息:在运行查询之前,需要配置SQLAlchemy(即,告诉您使用什么数据库、如何连接等等),那么Django需要类似的配置(通过您选择的方法实现——您不需要完整的Django设置文件)有什么缺点吗

至于多数据库支持,您似乎感到困惑:支持的级别很低。查询对象——不是
QuerySet
,而是它将执行的底层
query
对象知道它连接到哪个数据库,并接受一个数据库连接
\standAlone
    __init__.py
    myScript.py
    manage.py
    settings.py
\myApp
    __init__.py
    models.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 *
    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
from django.db import models

class MyModel(models.Model):
     field = models.CharField(max_length=255)
manage.py sql MyApp
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)
./launcher.py
./modelsapp
    __init__.py
    models.py
# 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
python setup.py install
django-models-standalone startproject myproject
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()
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()
mydjangoproject
    |
    > app1
    > core
    > app2
    > standalone
    | | __init__.py  
    | | conf.py  
    | | myscript.py
    > manage.py
class Router(object):
    app_label = ''

    def db_for_read(self, model, **hints):
        if model._meta.app_label == self.app_label:
            return self.app_label
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == self.app_label:
            return self.app_label
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == self.app_label or obj2._meta.app_label == self.app_label:
           return True
        return None

    def allow_migrate(self, db, app_label, model=None, **hints):
        if app_label == self.app_label:
            return db == self.app_label
    return None
def add_db(db_conf):
    app_label = 'al_' + str(uuid4())

    settings.DATABASES[app_label] = db_conf

    router_class_name = 'Router' + app_label.capitalize()
    setattr(
        settings,
        router_class_name,
        type(router_class_name, (Router,), dict(app_label=app_label)),
    )
    settings.DATABASE_ROUTERS.append(
        '.'.join([settings.__name__, router_class_name])
    )
    connections.close_all()
return app_label
SECRET_KEY = 'secret'
DATABASES = {'default': {}}
DATABASE_ROUTERS = []
TIME_ZONE = None
from myproject.config import parse_config
from django import setup as django_setup
from django.conf import settings as django_settings

"""
Requirements:
  ODBC Driver: https://www.microsoft.com/en-ca/download/details.aspx?id=36434
  Django Engine: https://pypi.org/project/django-pyodbc-azure/
"""

config = parse_config()
django_settings.configure(
    DEBUG=True,
    DATABASES={
        'default': {
            'ENGINE': 'sql_server.pyodbc',
            'NAME': config.database_name,
            'HOST': config.database_server,  # exclude '\\MSSQLSERVER'
            'USER': config.database_username,
            'PASSWORD': config.database_password,
            'PORT': '',
            'AUTOCOMMIT': False,
            'OPTIONS': {
                'driver': 'ODBC Driver 11 for SQL Server',
            },
        },
    })
django_setup()


from django.db import models

class Foo(models.Model):
    name = models.CharField(max_length=25)

    class Meta:
        app_label = 'myapp'  # each model will require this
import os, sys
import django

# sys.path.append('/abs/path/to/my-project/)
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
django.setup()

# Use
from myapp import models
kv = models.KeyValue()