Django设置使用两个引擎配置数据库

时间:2013-11-30 20:20:23

标签: django postgresql postgis django-settings

我正在尝试使用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示例教程显示使用这个

DATABASES = {
    'default': {
         'ENGINE': 'django.contrib.gis.db.backends.postgis',
         'NAME': 'geodjango',
         'USER': 'geo',
     }
}

问题:我需要两个引擎在同一个数据库上工作,因为我正在使用带postgis扩展名的postgresql,我想定义一个包含如下地理列的表:< / p>

MapLocation GEOGRAPHY(POINT)

并从Django中引用它,如maplocation = models.PointField()

显然我需要两个引擎的混搭,其余的如上面提到的'默认'我只是不知道如何让它工作

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 为 'location' 时使用 'location' 数据库。

路由器类应如下所示:

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', ]