代码之家  ›  专栏  ›  技术社区  ›  Henry Lynx

具有相同数据库的两个Django项目-拒绝关系Django_迁移的权限

  •  1
  • Henry Lynx  · 技术社区  · 7 年前

    我有两个django项目,它们在本地主机上没有任何连接。我想让他们都使用同一个数据库。

    在第一个项目成功后,我试图在第二个项目上创建迁移,但我遇到了一个例外:

    django.db.utils.ProgrammingError: permission denied for relation django_migrations
    

    我的设置如下:

    //First project
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'srt_side_by_side',
            'USER': 'srt_side_by_side_admin',
            'PASSWORD': '******************',
            'HOST': 'localhost',
            'PORT': '',
        }
    }
    //Second project
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'srt_side_by_side',
            'USER': 'srt_side_by_side_admin_2',
            'PASSWORD': '**************',
            'HOST': 'localhost',
            'PORT': '',
        }
    }
    

    我已将超级用户权限授予两个用户。 我试图在作为psql shell中的相应用户连接时设置个人权限。

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to srt_side_by_side_admin_2;
    GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to srt_side_by_side_admin_2;
    GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to srt_side_by_side_admin_2;
    

    psql shell中的DB访问权限:

    =Tc/simeonparvanov
    simeonparvanov=CTc/simeonparvanov   
    srt_side_by_side_admin=CTc/simeonparvanov 
    srt_side_by_side_admin_2=CTc/simeonparvanov
    

    知道我做错了什么吗?

    3 回复  |  直到 7 年前
        1
  •  3
  •   aliva    7 年前

    问题是两个项目都有自己的迁移文件,并且它们相互冲突,解决方案是只选择一个项目来管理数据库(迁移和更改),另一个项目应该只连接到数据库(不更改数据库结构)

    假设您已经选择了主项目(运行迁移的项目),我可以为您的第二个项目想出两个解决方案

    • 使用运行secons项目的迁移 --fake 参数: docs

    告诉Django将迁移标记为已应用或未应用,但实际上没有运行SQL来更改数据库架构。

    • 在第二个项目的模型类中设置元选项 managed False (它告诉django,您将手动处理此模型的db创建和迁移 docs

    示例代码:

    class MyModel(models.Model):
        # fields
        # ...
    
        class Meta:
            managed = False
    
        2
  •  1
  •   Arpit Singh    7 年前

    您不需要创建两个单独的用户。有关更多信息,请签出 https://groups.google.com/forum/#!msg/django-users/uA_XyGYKn2o/km80RXBB2uMJ

        3
  •  1
  •   Andrey Bondar    7 年前

    您的项目是否没有任何关系,您只想运行一个postgres server实例? 若是这样,你们只需要在postgres中创建两个独立的数据库,将你们的用户设置为拥有这两个数据库,然后在字段中设置它们的名称 name 配置的。

    类似于:

    CREATE DATABASE srt_side_by_side_2 OWNER srt_side_by_side_admin;

    然后对于第二个项目配置:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'srt_side_by_side_2',
            'USER': 'srt_side_by_side_admin',
            'PASSWORD': '**************',
            'HOST': 'localhost',
            'PORT': '',
        }
    }