1

我想使用旧数据库中的用户,但将其他所有内容保留在“默认”数据库中。

我有 atm 的主要问题是我无法让数据库路由器正确地将查询转发到适当的数据库。即当我运行迁移 2 次时,第二次出现错误

~> DJANGO_SETTINGS_MODULE=settings python manage.py makemigrations
Migrations for 'myapp':
  myapp/migrations/0001_initial.py
    - Create model CustomUser
~> DJANGO_SETTINGS_MODULE=settings python manage.py makemigrations
Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/home/manos/workspace/umed/common/oauth2_test/.env/lib/python3.7/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/home/manos/workspace/umed/common/oauth2_test/.env/lib/python3.7/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/manos/workspace/umed/common/oauth2_test/.env/lib/python3.7/site-packages/django/core/management/base.py", line 328, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/manos/workspace/umed/common/oauth2_test/.env/lib/python3.7/site-packages/django/core/management/base.py", line 369, in execute
    output = self.handle(*args, **options)
  File "/home/manos/workspace/umed/common/oauth2_test/.env/lib/python3.7/site-packages/django/core/management/base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "/home/manos/workspace/umed/common/oauth2_test/.env/lib/python3.7/site-packages/django/core/management/commands/makemigrations.py", line 101, in handle
    loader.check_consistent_history(connection)
  File "/home/manos/workspace/umed/common/oauth2_test/.env/lib/python3.7/site-packages/django/db/migrations/loader.py", line 299, in check_consistent_history
    connection.alias,
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency myapp.0001_initial on database 'auth_db'.

所以我假设它尝试在auth_db而不是default数据库中运行管理内容。但我真的不知道我做错了什么,因为路由看起来是正确的。

下面的简化代码

模型.py

class CustomUser(AbstractUser):
    password = models.CharField(max_length=128)
    username = models.CharField(unique=True, max_length=32)

    class Meta:
        managed = False
        db_table = 'myauthdb_user'

    objects = UserManager()

数据库.py

class AuthRouter:
    """ Forwards queries for users models to the auth database. """

    def db_for_read(self, model, **hints):
        if model.__name__ == 'CustomUser':
            return 'auth_db'
        return None

设置.py

DATABASE_ROUTERS = ['db.AuthRouter']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': join(BASE_DIR, 'db.app'),
    },
    'auth_db': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'localhost',
    },
}

我可以很好地使用 ORM,例如CustomUser.objects.all()。但是移民问题是个大问题。一个天真的解决方案是禁用管理员,但我觉得潜在的问题仍然存在。

4

0 回答 0