Python Django中的多数据库
我正试图在Django项目中设置许多数据库。 这是my settings.py:Python Django中的多数据库,python,django,Python,Django,我正试图在Django项目中设置许多数据库。 这是my settings.py: DATABASES = { 'default': { 'ENGINE': 'django.contrib.gis.db.backends.postgis', 'NAME': 'portail', 'USER': 'postgres', 'PASSWORD': '', 'HOST': '', 'PORT':
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正在进入“如果”
在发表一些评论之后,我向大家提出我的看法:
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相同):
我解决了我的问题。它与游标连接在一起。我认为,我要补充:
from django.db import connections
#cursor = connection.cursor()
cursor = connections['osm'].cursor()
现在,连接知道数据库了。我的路由器在这种情况下没用
来源:您在该地址有什么查看功能?你能发布它的代码吗?@etienne trimaille,你已经确认它正在从db_for_read()返回所需的输出?您可以通过检查模型管理器上的db属性来实现这一点。我们可以查看您的视图(可能还有模型)代码,也可以尝试使用django扩展插件,使用
/manage.py runserver\u plus--print sql
@VasilyAlexeev我添加了我的视图和模型。Django扩展似乎非常有用,但我在安装它时遇到了一些困难(依赖性)。我正在重试。您是否验证了您的应用程序名实际上是api
?另外,您确定这两个数据库实际上都存在吗?
from django.db import connections
#cursor = connection.cursor()
cursor = connections['osm'].cursor()