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

Two Django projects with same database - permission denied for relation django_migrations

我有两个没有以任何方式连接的 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': '',
    }
}

我已将 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中的DB访问权限shell:

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

知道我做错了什么吗?

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

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

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

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

Tells Django to mark the migrations as having been applied or unapplied, but without actually running the SQL to change your database schema.

  • 在你的模型class中为第二个项目设置元选项managedFalse(它告诉django你将手动处理这个模型的数据库创建和迁移docs

示例代码:

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

    class Meta:
        managed = False

您的项目是否没有任何关系,您只想 运行 只有一个 postgres 服务器实例? 如果是这样,那么您只需要在 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': '',
    }
}