postgres 的 Django 1.8 迁移错误

Posted

技术标签:

【中文标题】postgres 的 Django 1.8 迁移错误【英文标题】:Django 1.8 migration error with postgres 【发布时间】:2018-01-14 17:14:13 【问题描述】:

我是 Django 新手,我正在尝试使用 Django(1.8) 在 Postgre 中创建表

以下是我的模型类

    class Student(models.Model):
        name = models.CharField(max_length = 50)
        degree = models.CharField(max_length = 50)
        numofsubs = models.IntegerField()
        namesofsubs= models.CharField(max_length = 50)
        details = models.CharField(max_length = 50)

class Meta:

      db_table = "student"

views.py

def addStudent(request):
    student = Student(name = request.name, degree = request.degree ,
     numofsubs = request.numofsubs , nameofsubs = request.nameofparams , details = request.details)
    student.save()
    print 'data saved'

在我尝试运行 python manage.py migrate 进行这些更改后,我得到了django.db.utils.ProgrammingError: permission denied for relation django_migrations

以下是堆栈跟踪

Traceback(最近一次调用最后一次):文件“manage.py”,第 10 行,在 execute_from_command_line(sys.argv) 文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/core/management/init.py”, 第 338 行,在 execute_from_command_line utility.execute() 文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/core/management/init.py”, 第 330 行,执行中 self.fetch_command(subcommand).run_from_argv(self.argv) 文件 "/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/core/management/base.py", 第 390 行,在 run_from_argv self.execute(*args, **cmd_options) 文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/core/management/base.py”, 第 441 行,执行中 输出 = self.handle(*args, **options) 文件 "/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", 第 93 行,在句柄中 executor = MigrationExecutor(connection, self.migration_progress_callback) 文件 “/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/migrations/executor.py”, 第 19 行,在 init 中 self.loader = MigrationLoader(self.connection) 文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/migrations/loader.py”, 第 47 行,在 init 中 self.build_graph() 文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/migrations/loader.py”, 第 180 行,在 build_graph self.applied_migrations = recorder.applied_migrations() 文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/migrations/recorder.py”, 第 60 行,在应用迁移中 return set(tuple(x) for x in self.migration_qs.values_list("app", "name")) 文件 “/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/models/query.py”, 第 162 行,在 iter 中 self._fetch_all() 文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/models/query.py”, 第 965 行,在 _fetch_all 中 self._result_cache = list(self.iterator()) 文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/models/query.py”, 第 1220 行,在迭代器中 对于 compiler.results_iter() 中的行:文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py”, 第 783 行,在 results_iter 中 结果 = self.execute_sql(MULTI) 文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/models/sql/compiler.py”, 第 829 行,在 execute_sql 中 cursor.execute(sql,params)文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/backends/utils.py”, 第 79 行,在执行中 返回超级(CursorDebugWrapper,self).execute(sql,params)文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/backends/utils.py”, 第 64 行,在执行中 返回 self.cursor.execute(sql, params) 文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/utils.py”, 第 97 行,在 退出 六.reraise(dj_exc_type,dj_exc_value,traceback)文件“/usr/lib/ckan/default/local/lib/python2.7/site-packages/django/db/backends/utils.py”, 第 64 行,在执行中 return self.cursor.execute(sql, params) django.db.utils.ProgrammingError: 关系的权限被拒绝 django_migrations

我的settings.py 有以下用于 db 连接的配置

DATABASES = 
    'default': 
       # 'ENGINE': 'django.db.backends.sqlite3',
       # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'abc',
        'USER': 'xyz',
        'PASSWORD': 'xxxxx',
        'HOST': 'localhost',
        'PORT': 5432,
    

请指导我的应用程序出了什么问题。

谢谢

【问题讨论】:

您是否以 django 用户为所有者创建了 postgres 数据库? 我在通过 shel 安装 postgres 时创建了 db,现在我想通过 django 连接到该 db 并在表中创建和插入数据 你能测试本地连接psql -h localhost -U xyz abc吗? 【参考方案1】:

您可能需要允许您的用户使用 Grands:

GRANT ALL ON DATABASE abc TO xyz;

【讨论】:

【参考方案2】:

我不建议做 GRANT ALL。但是,正如 Bear Brown 指出的那样,这听起来像是权限问题,因此请确保您至少具有相关架构的 USAGE 和表的 SELECT 权限。先连接abc数据库,然后在public上授予select权限:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO xyz

【讨论】:

以上是关于postgres 的 Django 1.8 迁移错误的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.8 迁移无法将列 ID 转换为整数

Django 1.7 和 1.8 之间迁移行为的变化

无法将 Django 从 1.7 迁移到 1.8

django 1.8 测试模型和迁移

Django 1.8:删除迁移文件夹后未检测到迁移

Django 从 MySQL 迁移到 Postgres