Django - 无法使用两个数据库进行测试(带有 gis 扩展名的 postgres 和 mongoDB (Djongo)
Django - Unable to test with two databases (postgres with gis extension and mongoDB (Djongo)
我无法使用 Django 的单元测试来测试两个数据库。
我的数据库配置:
DATABASES = {
'default': {},
'postgres': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': "<name>",
'USER': "<user>",
'PASSWORD': "<pass>",
'HOST': "localhost",
'PORT': 5432,
},
'mongodb': {
'ENGINE': 'djongo',
'NAME': '<name>',
'ENFORCE_SCHEMA': True,
}
}
我的简单测试:
from django.test import TestCase
class TestFormModel(TestCase):
databases = {'postgres', 'mongodb'}
def test_generate_persistent_data_indexes(self):
assert True
我遇到的错误:
AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'
我迁移了两个数据库
当我将 postgres
数据库设置为 default
时,我得到:
self = <django.db.backends.utils.CursorWrapper object at 0x1132de580>
sql = 'SELECT "user_userdata"."id", "user_userdata"."user_profile",
"user_userdata"."data", "user_userdata"."is_persistent" FROM "user_userdata" ORDER BY
"user_userdata"."id" ASC', params = ()
ignored_wrapper_args = (False, {'connection':
<django.contrib.gis.db.backends.postgis.base.DatabaseWrapper object at 0x112d96f70>,
'cursor': <django.db.backends.utils.CursorWrapper object at 0x1132de580>})
def _execute(self, sql, params, *ignored_wrapper_args):
self.db.validate_no_broken_transaction()
with self.db.wrap_database_errors:
if params is None:
return self.cursor.execute(sql)
else:
> return self.cursor.execute(sql, params)
E django.db.utils.ProgrammingError: column user_userdata.data does not
exist
E LINE 1: ...r_userdata"."id", "user_userdata"."user_profile",
"user_user...
E ^
venv/lib/python3.8/site-packages/django/db/backends/utils.py:84: ProgrammingError
我的MongoDB模特:
class UserData(djongo_models.Model):
id = djongo_models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user_profile = djongo_models.UUIDField()
data = djongo_models.JSONField(default={})
is_persistent = djongo_models.BooleanField(default=False)
objects = djongo_models.DjongoManager()
更新:
我的数据库路由器在 allow_migrate 方法中指向了错误的数据库。来自 Postgres 的迁移正在应用于 MongoDB,这导致了一个问题。
(不)有趣的事实:
model._meta.app_label returns 小写模型名称,我花了大约 2 个小时才正确。
允许从我的路由器迁移方法:
只有来自用户应用的 UserData 模型正在使用 mongodb
ROUTE_APP_LABEL = 'user'
ROUTE_MODEL_LABELS = {'userdata'}
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Migrate specified models in specified apps to mongodb
OR
Migrate rest of the models if database is default (postgres)
"""
if app_label == self.ROUTE_APP_LABEL and model_name in self.ROUTE_MODEL_LABELS:
return db == 'mongodb'
return db != 'mongodb'
我设法解决了这个问题。
我的数据库路由器在 allow_migrate 方法中指向了错误的数据库。来自 Postgres 的迁移正在应用于 MongoDB,这导致了一个问题。
(不)有趣的事实:
model._meta.app_label returns 小写模型名称,我花了大约 2 个小时才正确。
允许从我的路由器迁移方法:
只有来自用户应用的 UserData 模型正在使用 mongodb
ROUTE_APP_LABEL = 'user'
ROUTE_MODEL_LABELS = {'userdata'}
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Migrate specified models in specified apps to mongodb
OR
Migrate rest of the models if database is default (postgres)
"""
if app_label == self.ROUTE_APP_LABEL and model_name in self.ROUTE_MODEL_LABELS:
return db == 'mongodb'
return db != 'mongodb'
我无法使用 Django 的单元测试来测试两个数据库。
我的数据库配置:
DATABASES = {
'default': {},
'postgres': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': "<name>",
'USER': "<user>",
'PASSWORD': "<pass>",
'HOST': "localhost",
'PORT': 5432,
},
'mongodb': {
'ENGINE': 'djongo',
'NAME': '<name>',
'ENFORCE_SCHEMA': True,
}
}
我的简单测试:
from django.test import TestCase
class TestFormModel(TestCase):
databases = {'postgres', 'mongodb'}
def test_generate_persistent_data_indexes(self):
assert True
我遇到的错误:
AttributeError: 'DatabaseOperations' object has no attribute 'geo_db_type'
我迁移了两个数据库
当我将 postgres
数据库设置为 default
时,我得到:
self = <django.db.backends.utils.CursorWrapper object at 0x1132de580>
sql = 'SELECT "user_userdata"."id", "user_userdata"."user_profile",
"user_userdata"."data", "user_userdata"."is_persistent" FROM "user_userdata" ORDER BY
"user_userdata"."id" ASC', params = ()
ignored_wrapper_args = (False, {'connection':
<django.contrib.gis.db.backends.postgis.base.DatabaseWrapper object at 0x112d96f70>,
'cursor': <django.db.backends.utils.CursorWrapper object at 0x1132de580>})
def _execute(self, sql, params, *ignored_wrapper_args):
self.db.validate_no_broken_transaction()
with self.db.wrap_database_errors:
if params is None:
return self.cursor.execute(sql)
else:
> return self.cursor.execute(sql, params)
E django.db.utils.ProgrammingError: column user_userdata.data does not
exist
E LINE 1: ...r_userdata"."id", "user_userdata"."user_profile",
"user_user...
E ^
venv/lib/python3.8/site-packages/django/db/backends/utils.py:84: ProgrammingError
我的MongoDB模特:
class UserData(djongo_models.Model):
id = djongo_models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user_profile = djongo_models.UUIDField()
data = djongo_models.JSONField(default={})
is_persistent = djongo_models.BooleanField(default=False)
objects = djongo_models.DjongoManager()
更新: 我的数据库路由器在 allow_migrate 方法中指向了错误的数据库。来自 Postgres 的迁移正在应用于 MongoDB,这导致了一个问题。
(不)有趣的事实: model._meta.app_label returns 小写模型名称,我花了大约 2 个小时才正确。
允许从我的路由器迁移方法:
只有来自用户应用的 UserData 模型正在使用 mongodb
ROUTE_APP_LABEL = 'user'
ROUTE_MODEL_LABELS = {'userdata'}
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Migrate specified models in specified apps to mongodb
OR
Migrate rest of the models if database is default (postgres)
"""
if app_label == self.ROUTE_APP_LABEL and model_name in self.ROUTE_MODEL_LABELS:
return db == 'mongodb'
return db != 'mongodb'
我设法解决了这个问题。
我的数据库路由器在 allow_migrate 方法中指向了错误的数据库。来自 Postgres 的迁移正在应用于 MongoDB,这导致了一个问题。
(不)有趣的事实: model._meta.app_label returns 小写模型名称,我花了大约 2 个小时才正确。
允许从我的路由器迁移方法:
只有来自用户应用的 UserData 模型正在使用 mongodb
ROUTE_APP_LABEL = 'user'
ROUTE_MODEL_LABELS = {'userdata'}
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Migrate specified models in specified apps to mongodb
OR
Migrate rest of the models if database is default (postgres)
"""
if app_label == self.ROUTE_APP_LABEL and model_name in self.ROUTE_MODEL_LABELS:
return db == 'mongodb'
return db != 'mongodb'