Django 设置使用两个引擎配置数据库
Posted
技术标签:
【中文标题】Django 设置使用两个引擎配置数据库【英文标题】:Django settings configure databases with two engines 【发布时间】:2013-12-16 19:08:33 【问题描述】:我正在尝试使用 postgresql 和 postgis 运行 DJango
对于 Django 和 postgresql,我将 setting.py
文件配置如下
DATABASES =
'default':
'ENGINE':'django.db.backends.postgresql_psycopg2',
'NAME': 'myDatabaseName',
'USER': 'postgres',
'PASSWORD': 'MyPassword',
'HOST': '',
'PORT': '5432',
但是查看 Django geo example 的教程显示使用这个
DATABASES =
'default':
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'geodjango',
'USER': 'geo',
问题:我需要两个引擎在同一个数据库上工作,因为我正在使用带有 postgis 扩展名的 postgresql,我想定义一个具有如下地理列的表:
MapLocation GEOGRAPHY(POINT)
并像这样从 Django 引用它maplocation = models.PointField()
显然,我需要将两个引擎与上面“默认”中提到的其余引擎混合在一起,我只是不知道如何使其工作
【问题讨论】:
查看 Django 中supporting multiple databases 上的文档。 错误信息是什么? @Josephpaetz 我已经编辑了我的问题,我需要两个引擎在同一个数据库上工作 @Mingyu 我得到的错误是:文件“/usr/local/lib/python2.7/dist-packages/Django-1.6-py2.7.egg/django/contrib/gis/db /models/fields.py",第 202 行,在 db_type 返回 connection.ops.geo_db_type(self) AttributeError: 'DatabaseOperations' 对象没有属性 'geo_db_type' 你安装postgis
了吗?
【参考方案1】:
我可能有点晚了,但是如果其他人偶然发现了这个链接,我是这样做的:
在你的 settings.py 中
DATABASES =
'default':
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'postgres_user',
'PASSWORD': 's3krit'
,
'location':
'NAME': 'app_data',
'ENGINE': 'django.contrib.gis.db.backends.postgis',,
'USER': 'postgres_user',
'PASSWORD': 's3krit'
所以我们只在设置中更改了引擎。
现在,我们需要告诉数据库从第二个数据库写入和读取地理数据。
为此,在你的 models.py 中,假设你有一个 Location 类:
class Location(models.Model):
location_points = models.PointField(default=Point(0,0))
address = models.TextField(null=True,blank=True)
label = models.CharField(max_length=200,null=True,blank=True)
class Meta:
db_table = 'location'
注意Meta类中的db_table属性,这是必须的。
现在您需要定义数据库路由器以在 db_table 为“位置”时使用“位置”数据库。
这是路由器类的外观:
class DbRouter(object):
"""
A router to control all database operations on models in the
auth application.
"""
def db_for_read(self, model, **hints):
"""
Attempts to read location models go to location database.
"""
if model._meta.db_table == 'location':
return 'location'
return 'default'
def db_for_write(self, model, **hints):
"""
Attempts to write location models go to the location database.
"""
if model._meta.db_table == 'location':
return 'location'
return 'default'
def allow_relation(self, obj1, obj2, **hints):
"""
allow relations involving the location database
"""
return True
现在可以开始了,将路由器类保存在应用程序中名为 dbrouter.py 的文件中。
在你的 settings.py 文件中,添加这个:
DATABASE_ROUTERS = ['app_name.dbrouters.DbRouter', ]
【讨论】:
【参考方案2】:在 Django 中,你可以定义多个数据库连接:
DATABASES =
'default':
'NAME': 'app_data',
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'USER': 'postgres_user',
'PASSWORD': 's3krit'
,
'users':
'NAME': 'user_data',
'ENGINE': 'django.db.backends.mysql',
'USER': 'mysql_user',
'PASSWORD': 'priv4te'
参考:https://docs.djangoproject.com/en/dev/topics/db/multi-db/#defining-your-databases
【讨论】:
你指的不是两个不同的数据库吗?我的是同一个带有 postgis 扩展名的 postgresql 数据库,所以在表中我可以添加一个地理列,如 MapLocation GEOGRAPHY(POINT) 从您的问题来看,尚不清楚您是否拥有一个或多个数据库。如果您只有一个数据库连接,那么您似乎已经有了答案。以上是关于Django 设置使用两个引擎配置数据库的主要内容,如果未能解决你的问题,请参考以下文章