django multi db更改实习生模型的数据库
django multi db change db of intern models
使用 multidb 路由器,如何将所有 django_* tables(模型)移动到另一个非默认的数据库(也移动 django_migrations table)?
根据"move",我同意最初将它们简单地放在另一个数据库中
编辑:好的,似乎 django_migration 无法移动并且存在于每个数据库中...
但是使用该代码,我遇到了一个奇怪的错误:
web/settings.py:
DATABASES = {
'intern_db': {
'ENGINE': 'mysql.connector.django',
'NAME': 'django_cartons',
'USER': 'root',
'PASSWORD' : '',
},
'default': {
'ENGINE': 'mysql.connector.django',
'NAME': 'carton2',
'USER': 'root',
'PASSWORD' : '',
}
}
DATABASE_ROUTERS = ['web.AuthRouter.AuthRouter']
web/AuthRouter.py
class AuthRouter(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 auth.
"""
if model._meta.app_label == 'auth':
return 'intern_db'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to auth.
"""
if model._meta.app_label == 'auth':
return 'intern_db'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the auth app is involved.
"""
if obj1._meta.app_label == 'auth' or \
obj2._meta.app_label == 'auth':
return True
return None
def allow_migrate(self, db, model):
"""
Make sure the auth app only appears in the 'auth'
database.
"""
return False
if db == 'intern_db':
return (model._meta.app_label == 'auth')
elif model._meta.app_label == 'auth':
return False
return None
错误:
$> ./manage.py migrate
Operations to perform:
Apply all migrations: contenttypes, admin, auth, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial...Traceback (most recent call last):
File "/usr/lib/python3.4/site-packages/mysql/connector/django/base.py", line 115, in _execute_wrapper
return method(query, args)
File "/usr/lib/python3.4/site-packages/mysql/connector/cursor.py", line 507, in execute
self._handle_result(self._connection.cmd_query(stmt))
File "/usr/lib/python3.4/site-packages/mysql/connector/connection.py", line 722, in cmd_query
result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
File "/usr/lib/python3.4/site-packages/mysql/connector/connection.py", line 640, in _handle_result
raise errors.get_exception(packet)
mysql.connector.errors.DatabaseError: 1005 (HY000): Can't create table `carton2`.`#sql-c20_10d` (errno: 150 "Foreign key constraint is incorrectly formed")
正如 knbk 所说,您必须通过 --database
选项来选择数据库。
实际上,将 django tables 放在另一个数据库而不是默认的数据库中是一个糟糕的选择,因为其他应用程序假定这些 tables 是默认的。此外,还有一个 "migration" table 自动创建,这是 django 所需要的。
使用 multidb 路由器,如何将所有 django_* tables(模型)移动到另一个非默认的数据库(也移动 django_migrations table)?
根据"move",我同意最初将它们简单地放在另一个数据库中
编辑:好的,似乎 django_migration 无法移动并且存在于每个数据库中...
但是使用该代码,我遇到了一个奇怪的错误:
web/settings.py:
DATABASES = {
'intern_db': {
'ENGINE': 'mysql.connector.django',
'NAME': 'django_cartons',
'USER': 'root',
'PASSWORD' : '',
},
'default': {
'ENGINE': 'mysql.connector.django',
'NAME': 'carton2',
'USER': 'root',
'PASSWORD' : '',
}
}
DATABASE_ROUTERS = ['web.AuthRouter.AuthRouter']
web/AuthRouter.py
class AuthRouter(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 auth.
"""
if model._meta.app_label == 'auth':
return 'intern_db'
return None
def db_for_write(self, model, **hints):
"""
Attempts to write auth models go to auth.
"""
if model._meta.app_label == 'auth':
return 'intern_db'
return None
def allow_relation(self, obj1, obj2, **hints):
"""
Allow relations if a model in the auth app is involved.
"""
if obj1._meta.app_label == 'auth' or \
obj2._meta.app_label == 'auth':
return True
return None
def allow_migrate(self, db, model):
"""
Make sure the auth app only appears in the 'auth'
database.
"""
return False
if db == 'intern_db':
return (model._meta.app_label == 'auth')
elif model._meta.app_label == 'auth':
return False
return None
错误:
$> ./manage.py migrate
Operations to perform:
Apply all migrations: contenttypes, admin, auth, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial...Traceback (most recent call last):
File "/usr/lib/python3.4/site-packages/mysql/connector/django/base.py", line 115, in _execute_wrapper
return method(query, args)
File "/usr/lib/python3.4/site-packages/mysql/connector/cursor.py", line 507, in execute
self._handle_result(self._connection.cmd_query(stmt))
File "/usr/lib/python3.4/site-packages/mysql/connector/connection.py", line 722, in cmd_query
result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
File "/usr/lib/python3.4/site-packages/mysql/connector/connection.py", line 640, in _handle_result
raise errors.get_exception(packet)
mysql.connector.errors.DatabaseError: 1005 (HY000): Can't create table `carton2`.`#sql-c20_10d` (errno: 150 "Foreign key constraint is incorrectly formed")
正如 knbk 所说,您必须通过 --database
选项来选择数据库。
实际上,将 django tables 放在另一个数据库而不是默认的数据库中是一个糟糕的选择,因为其他应用程序假定这些 tables 是默认的。此外,还有一个 "migration" table 自动创建,这是 django 所需要的。