簡體   English   中英

Django中的多數據庫

[英]Multi-database in Django

我正在嘗試在Django項目中設置許多數據庫。 這是我的settings.py:

    DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'portail',
        'USER': 'postgres',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    },
    'osm': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'osm', 
        'USER': 'postgres',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}

DATABASE_ROUTERS = ['portail.router.dbrouter']

我知道,我正在使用postgres用戶。 是開發人員

我在portail文件夾中有這個router.py:

class dbrouter(object): 
    def db_for_read(self, model, **hints):
        if model._meta.app_label == 'api':
            return 'osm'
        return 'default'

如果我嘗試獲得:

http://127.0.0.1:8000/api/way/96300215

我有一個錯誤,我的表不存在。 我想它不能確定哪個數據庫。

我知道我的路由器已執行。 這很奇怪,如果我在django(默認值和osm)中用相同的名稱切換了兩個數據庫“ portail”和“ osm”,它仍然不起作用。 而且我知道Django將進入“ if”狀態。

經過一番評論,我給你我的看法:

def getObject(request,type,id,format):

    if type == "node":
        osmObject = get_object_or_404(PlanetOsmPoint,osm_id=id)    

    if type == "way" or type == "relation":
        if type == "relation":
            id = int(id) * -1

        #Un way|relation peut-être dans la table line ou polygon, il faut tester avec un union et récuperer le type de géometrie
        cursor = connection.cursor()
        cursor.execute('SELECT ST_GeometryType(way) FROM planet_osm_line WHERE osm_id= %s UNION SELECT ST_GeometryType(way) FROM planet_osm_polygon WHERE osm_id= %s',[id,id])

        #Si plusieurs résultats, erreur !
        if cursor.rowcount != 1:
            print cursor.rowcount
            raise Http404

    osmType = cursor.fetchone()

        if osmType[0] == u'ST_Polygon':
            osmObject = get_object_or_404(PlanetOsmPolygon,osm_id=id)
        elif osmType[0] == u'ST_LineString':
            osmObject = get_object_or_404(PlanetOsmLine,osm_id=id)
        else:
            raise Http404


    if format == '' or format == "geojson" or format == "json":
        return HttpResponse(osmObject.way.geojson, content_type="application/json")

我的模型之一(PlanetOsmLine,PlanetOsmPoint或PlanetOsmPolygon相同):

class PlanetOsmLine(models.Model):
    osm_id = models.BigIntegerField(primary_key=True)
    school_cm = models.TextField(db_column='school:CM', blank=True) # Field name made lowercase. Field renamed to remove unsuitable characters.
    access = models.TextField(blank=True)
    addr_housename = models.TextField(db_column='addr:housename', blank=True) # Field renamed to remove unsuitable characters.
    addr_housenumber = models.TextField(db_column='addr:housenumber', blank=True) # Field renamed to remove unsuitable characters.
    addr_interpolation = models.TextField(db_column='addr:interpolation', blank=True) # Field renamed to remove unsuitable characters.
    admin_level = models.TextField(blank=True)
    aerialway = models.TextField(blank=True)
    aeroway = models.TextField(blank=True)
    amenity = models.TextField(blank=True)
    #Some other fields, the list is quite long
    wetland = models.TextField(blank=True)
    width = models.TextField(blank=True)
    wood = models.TextField(blank=True)
    z_order = models.IntegerField(null=True, blank=True)
    way_area = models.FloatField(null=True, blank=True)

    #way = models.LineStringField(blank=True,srid=3857) # This field type is a guess.
    way = models.GeometryField(blank=True,srid=3857) # This field type is a guess.
    objects = models.GeoManager()

    def __unicode__(self):
        return str(self.osm_id)

    class Meta:
        db_table = 'planet_osm_line'
        verbose_name_plural = "planet_osm_line"
        managed = False

問候

我解決了我的問題。 它與光標連接有關。 我認為,我添加:

from django.db import connections
#cursor = connection.cursor()
cursor = connections['osm'].cursor()

現在,連接知道數據庫了。 我的路由器在這種情況下沒有用。

來源: https : //docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-direct

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM