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

时间:2017-12-05 12:05:16

标签: django psql django-migrations

我有两个django项目没有以任何方式连接,都在localhost上。我想让他们都使用相同的数据库。

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

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': '',
    }
}

我已向两位用户授予SUPERUSER权限。 我尝试在作为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中的数据库访问权限:

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

知道我做错了什么吗?

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

示例代码:

class MyModel(models.Model):
    # fields
    # ...

    class Meta:
        managed = False

答案 1 :(得分:1)

您无需创建两个单独的用户。了解更多信息https://groups.google.com/forum/#!msg/django-users/uA_XyGYKn2o/km80RXBB2uMJ

答案 2 :(得分:1)

您的项目是否没有任何关系,您只想运行一个postgres服务器实例? 如果是这样,您只需要在postgres中创建两个单独的数据库,将您的用户设置为拥有它们,然后在config的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': '',
    }
}