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