我使用两个数据库,一个是Mysql,另一个是PostgreSql。
-
Mysql定义为"默认",PostgreSql定义为"location_db">
-
我有5个应用程序,比如说"a,b,c,d,位置"应用程序,
-
所有应用程序都应该在"默认"数据库上运行所有东西,除了位置应用程序,
-
我只做"python manage.py runserver",然后一切都很好,甚至网站也很好,但当我在管理页面上,然后点击"location"管理模型时,它会运行错误*关系"location_locationmodel"不存在;第1行:另一方面,从"location_locationmodel"*中选择COUNT(*)作为"__COUNT",如果我单击"abcd"管理模型,它会正常工作。
1)这是router.py(我刚刚从doc.django网站获得路由器代码,也许这些代码不适合我,因为我只是猜测我的路由器配置不正确?也许?)
class LocationRouter(object):
"""
A router to control all database operations on models in the
auth application.
"""
def db_for_read(self, model, **hints):
"""
Attempts to read auth models go to location_db.
"""
if model._meta.app_label == 'location':
return 'location_db'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to location_db.
"""
if model._meta.app_label == 'location':
return 'location_db'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the events app is involved.
"""
if obj1._meta.app_label == 'location' or
obj2._meta.app_label == 'location':
return True
return None
def allow_migrate(self, db, app_label, model_name=None, **hints):
"""
Make sure the auth app only appears in the 'location_db'
database.
"""
if app_label == 'location':
return db == 'location_db'
return None
2) 这是设置.py
DATABASE_ROUTERS = ['location.router.LocationRouter']
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'OPTIONS': {
'read_default_file': os.path.join(BASE_DIR, 'my.cnf'),
},
},
'location_db': {
'ENGINE': 'django.contrib.gis.db.backends.postgis',
'NAME': 'geo',
'USER': 'john',
'PASSWORD': 'toor',
'HOST': 'localhost',
'PORT': '5432',
},
}
*我的预测*
1) 如果我做另一个项目,只使用PostgreSql,那么一切都很好,所以所有数据库都很好
2) 这是我做"python manage.py makemigrations or migrate"的时候:
Operations to perform:
Apply all migrations: admin, auth, a, contenttypes, location, b, c, d, registration, sessions, sites
Running migrations:
No migrations to apply.
*我认为迁移的结果不应该附带"位置"应用程序,或者可能附带。这只是我真的不知道的预测,但当我在管理页面上点击"位置"管理模型时,它会运行错误,但当我们只使用一个数据库时,它不会运行错误,我的意思是它会搜索仍在mysql数据库中的表吗?可能是路由器配置不正确*
下面的代码帮助我解决了这个问题
python manage.py migrate --run-syncdb
Okey Guys解决方案不会太远,如果你没有失眠,在这种情况下,你只需要指定所有
- python manage.py migrate location--database=location_db
现在,您的查询在postgresql数据库中匹配:)祝好运
我为模型生成的一个迁移文件也遇到了同样的问题。在花了几个小时之后,我通过从django_migrations
表中删除这些迁移文件来解决这个问题。
python manage.py dbshell
select * from django_migrations;
您将在应用程序中看到所有迁移的列表,删除所有抛出的错误。
delete from django_migrations where id>=xx
q
python manage.py migrate