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 设置使用两个引擎配置数据库的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.7.1-继续使用虚拟数据库引擎

Django ORM 数据库设置和读写分离

Django ORM 数据库设置和读写分离

django-数据库[配置]

Django基础之数据库与ORM

如何使用 pymysql 作为驱动程序配置 Django?