#28515: mysql is checking all models also models that are mapped to POSTGIS
-------------------------------------+-------------------------------------
Reporter: EDWIN CUBILLOS | Owner: nobody
Type: Bug | Status: new
Component: Database layer | Version: 1.11
(models, ORM) |
Severity: Normal | Resolution:
Keywords: postgis, mysql, | Triage Stage:
multidatabase | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Old description:
> **models**
> {{{
> from django.contrib.gis.db import models
>
> class Ciudad(models.Model):
> nombre = models.CharField(max_length=50, blank=True, null=True,
> unique=True)
> departamento = models.CharField(max_length=80, blank=True, null=True,
> unique=True)
> punto = models.PointField(blank=True, null=True)
> polygon = models.PolygonField(blank=True, null=True)
> precio_base = models.TextField(blank=True, null=True)
> precio_yamimo = models.TextField(blank=True, null=True)
>
> class Zona(models.Model):
> nombre = models.CharField(max_length=50, blank=True, null=True,
> unique=True)
> polygon = models.PolygonField(blank=True, null=True)
> ciudad = models.ForeignKey(Ciudad, blank=True, null=True)
> recargo = models.IntegerField(default=0, blank=True, null=True)
> }}}
>
> **settings**
>
> {{{
> INSTALLED_APPS = [
> 'django.contrib.admin',
> 'django.contrib.auth',
> 'django.contrib.contenttypes',
> 'django.contrib.sessions',
> 'django.contrib.messages',
> 'django.contrib.staticfiles',
> 'django.contrib.humanize',
> 'django.contrib.gis',
> 'compressor',
> 'django_extensions',
>
> 'djcelery',
> 'django_crontab',
>
> 'ciudades',
> 'api',
>
> ]
>
> DATABASES = {
> 'default': {
> 'ENGINE': 'django.db.backends.mysql',
> 'NAME': 'db_1',
> 'USER': 'root',
> 'PASSWORD': '****',
> 'HOST': '127.0.0.1',
> 'PORT': '3306',
> },
> 'celery': {
> 'ENGINE': 'django.db.backends.mysql',
> 'NAME': 'db_cel',
> 'USER': 'root',
> 'PASSWORD': '****',
> 'HOST': '127.0.0.1',
> 'PORT': '3306',
> },
> 'geozone': {
> 'ENGINE': 'django.contrib.gis.db.backends.postgis',
> 'NAME': 'db_post',
> 'USER': 'root',
> # 'PASSWORD': '****',
> 'HOST': '127.0.0.1',
> 'PORT': '5432',
> }
>
> }
>
> DATABASE_ROUTERS = ['api.router.AutoRouter']
>
> DB_APPS_MAPPING ={
> "ciudades" : "geozone",
> "django" : "celery",
> "djcelery" : "celery"
> }
> }}}
>
> **Router**
>
> {{{
> from settings import DB_APPS_MAPPING
>
> ## class for router app with db
> class AutoRouter(object):
>
> def db_for_read(self, model, **hints):
> # if app_label is not in maps is default db (None
> return DB_APPS_MAPPING.get(model._meta.app_label)
>
> def db_for_write(self, model, **hints):
> return DB_APPS_MAPPING.get(model._meta.app_label)
>
> def allow_relation(self, obj1, obj2, **hints):
> app1_db = DB_APPS_MAPPING.get(obj1._meta.app_label)
> app2_db = DB_APPS_MAPPING.get(obj2._meta.app_label)
> return True if app1_db == app2_db else None
>
> def allow_migrate(self, db, app_label, model_name=None, **hints):
> return DB_APPS_MAPPING.get(app_label)
> }}}
>
> **ERROR**
> {{{
> File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
> packages/django/core/checks/registry.py", line 81, in run_checks
> new_errors = check(app_configs=app_configs)
> File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
> packages/django/core/checks/model_checks.py", line 30, in
> check_all_models
> errors.extend(model.check(**kwargs))
> File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
> packages/django/db/models/base.py", line 1283, in check
> errors.extend(cls._check_fields(**kwargs))
> File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
> packages/django/db/models/base.py", line 1358, in _check_fields
> errors.extend(field.check(**kwargs))
> File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
> packages/django/db/models/fields/__init__.py", line 219, in check
> errors.extend(self._check_backend_specific_checks(**kwargs))
> File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
> packages/django/db/models/fields/__init__.py", line 322, in
> _check_backend_specific_checks
> return connections[db].validation.check_field(self, **kwargs)
> File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
> packages/django/db/backends/mysql/validation.py", line 49, in check_field
> field_type = field.db_type(self.connection)
> File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
> packages/django/contrib/gis/db/models/fields.py", line 126, in db_type
> return connection.ops.geo_db_type(self)
> AttributeError: 'DatabaseOperations' object has no attribute
> 'geo_db_type'
> }}}
>
> == I have forked the repo from official Django
> https://github.com/Cubillosxy/django , and I can pass this issue adding
> some lines to
> **lib/python2.7/site-packages/django/db/utils.py
> **
>
> line 294 in class **ConnectionRouter**
> {{{
> def allow_migrate(self, db, app_label, **hints):
>
> try:
> db_app_mapping = settings.DB_APPS_MAPPING.get(app_label,
> DEFAULT_DB_ALIAS)
> #if database are mapped and database has not app_label
> if db_app_mapping != db:
> return False
> except AttributeError:
> pass
>
> for router in self.routers:
> try:
> method = router.allow_migrate
> except AttributeError:
> # If the router doesn't have a method, skip to the next
> one.
> continue
>
> allow = method(db, app_label, **hints)
>
> if allow is not None:
> return allow
> return True
> }}}
>
> I don't know if it was a good solution, or I am doing some wrong in my
> code.
New description:
version 1.11
**models**
{{{
from django.contrib.gis.db import models
class Ciudad(models.Model):
nombre = models.CharField(max_length=50, blank=True, null=True,
unique=True)
departamento = models.CharField(max_length=80, blank=True, null=True,
unique=True)
punto = models.PointField(blank=True, null=True)
polygon = models.PolygonField(blank=True, null=True)
precio_base = models.TextField(blank=True, null=True)
precio_yamimo = models.TextField(blank=True, null=True)
class Zona(models.Model):
nombre = models.CharField(max_length=50, blank=True, null=True,
unique=True)
polygon = models.PolygonField(blank=True, null=True)
ciudad = models.ForeignKey(Ciudad, blank=True, null=True)
recargo = models.IntegerField(default=0, blank=True, null=True)
}}}
**settings**
{{{
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'django.contrib.gis',
'compressor',
'django_extensions',
'djcelery',
'django_crontab',
'ciudades',
'api',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_1',
'USER': 'root',
'PASSWORD': '****',
'HOST': '127.0.0.1',
'PORT': '3306',
},
'celery': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'db_cel',
'USER': 'root',
'PASSWORD': '****',
'HOST': '127.0.0.1',
'PORT': '3306',
},
'geozone': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'db_post',
'USER': 'root',
# 'PASSWORD': '****',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
DATABASE_ROUTERS = ['api.router.AutoRouter']
DB_APPS_MAPPING ={
"ciudades" : "geozone",
"django" : "celery",
"djcelery" : "celery"
}
}}}
**Router**
{{{
from settings import DB_APPS_MAPPING
## class for router app with db
class AutoRouter(object):
def db_for_read(self, model, **hints):
# if app_label is not in maps is default db (None
return DB_APPS_MAPPING.get(model._meta.app_label)
def db_for_write(self, model, **hints):
return DB_APPS_MAPPING.get(model._meta.app_label)
def allow_relation(self, obj1, obj2, **hints):
app1_db = DB_APPS_MAPPING.get(obj1._meta.app_label)
app2_db = DB_APPS_MAPPING.get(obj2._meta.app_label)
return True if app1_db == app2_db else None
def allow_migrate(self, db, app_label, model_name=None, **hints):
return DB_APPS_MAPPING.get(app_label)
}}}
**ERROR**
{{{
File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
packages/django/core/checks/registry.py", line 81, in run_checks
new_errors = check(app_configs=app_configs)
File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
packages/django/core/checks/model_checks.py", line 30, in check_all_models
errors.extend(model.check(**kwargs))
File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
packages/django/db/models/base.py", line 1283, in check
errors.extend(cls._check_fields(**kwargs))
File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
packages/django/db/models/base.py", line 1358, in _check_fields
errors.extend(field.check(**kwargs))
File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
packages/django/db/models/fields/__init__.py", line 219, in check
errors.extend(self._check_backend_specific_checks(**kwargs))
File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
packages/django/db/models/fields/__init__.py", line 322, in
_check_backend_specific_checks
return connections[db].validation.check_field(self, **kwargs)
File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
packages/django/db/backends/mysql/validation.py", line 49, in check_field
field_type = field.db_type(self.connection)
File "/Users/c02stf74fvh3/.virtualenvs/Rapigo/lib/python2.7/site-
packages/django/contrib/gis/db/models/fields.py", line 126, in db_type
return connection.ops.geo_db_type(self)
AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'
}}}
== I have forked the repo from official Django
https://github.com/Cubillosxy/django , and I can pass this issue adding
some lines to
**lib/python2.7/site-packages/django/db/utils.py
**
line 294 in class **ConnectionRouter**
{{{
def allow_migrate(self, db, app_label, **hints):
try:
db_app_mapping = settings.DB_APPS_MAPPING.get(app_label,
DEFAULT_DB_ALIAS)
#if database are mapped and database has not app_label
if db_app_mapping != db:
return False
except AttributeError:
pass
for router in self.routers:
try:
method = router.allow_migrate
except AttributeError:
# If the router doesn't have a method, skip to the next
one.
continue
allow = method(db, app_label, **hints)
if allow is not None:
return allow
return True
}}}
I don't know if it was a good solution, or I am doing some wrong in my
code.
--
Comment (by EDWIN CUBILLOS):
yes 1.11
sorry i forget add version ..
--
Ticket URL: <https://code.djangoproject.com/ticket/28515#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/068.502e5020eed009a460c96ce800972bae%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.