SQLite 工作,但 PostgreSQL 迁移数据库导致错误 - Django 3.0

Posted

技术标签:

【中文标题】SQLite 工作,但 PostgreSQL 迁移数据库导致错误 - Django 3.0【英文标题】:SQLite works, but PostgreSQL migrated database causes ERROR - Django 3.0 【发布时间】:2020-07-16 11:25:32 【问题描述】:

情况

我已经用几个应用程序构建了 Django 3.0、PostgreSQL 11、macOS 项目。 我创建了基于以下course 的帐户应用程序,它是github 比我创建了一个验证应用程序acc 所有这些都在 SQLite 数据库中完成 之前我已经为早期的应用试用了一个 PostgreSQL 数据库,它运行良好 但是现在当我在 settings.py 文件中将 SQLite 切换到 PostgreSQL 时,我得到一个错误我尝试登录 如果我将 settings.py 切换回 SQLite 一切正常(例如:身份验证、使用用户登录、用户在网站上使用自己的方式进行操作设置) 我使用 decorators.py 来保持登录用户访问登录和注册页面,当我切换到 postgresql 时出现错误。我这里只使用HttpResponse,错误信息包含

decorators.py

from django.http import HttpResponse
from django.shortcuts import redirect

def unauthenticated_user(view_func):
    def wrapper_func(request, *args, **kwargs):
        if request.user.is_authenticated:
            return redirect('home')
        else:
            return view_func(request, *args, **kwargs)

    return wrapper_func

def allowed_users(allowed_roles=[]):
    def decorator(view_func):
        def wrapper_func(request, *args, **kwargs):

            group = None
            if request.user.groups.exists():
                group = request.user.groups.all()[0].name

            if group in allowed_roles:
                return view_func(request, *args, **kwargs)
            else:
                return HttpResponse('Authorized')
        return wrapper_func
    return decorator

错误

如果我在 settings.py 使用 PostgreSQL 时登录。如果我注销一切正常。如果我使用 SQL lite,我可以登录并且一切正常

ValueError at /
The view accounts.decorators.wrapper_function didn't return an HttpResponse object. It returned None instead.
Request Method: GET
Request URL:    http://localhost...
Django Version: 3.0
Exception Type: ValueError
Exception Value: The view accounts.decorators.wrapper_function didn't return an HttpResponse object. It returned None instead.
Exception Location: /Users/.../python3.7/site-packages/django/core/handlers/base.py in _get_response, line 126
Python Executable:  /Users/.../bin/python3
Python Version: 3.7.3
.....

Request information
USER MYUSERNAME
GET No GET data
POST No POST data
FILES  No FILES data
COOKIES ...
...

试图解决

    我follow创建的用户组的指南在我迁移的postgreSQL数据库中也是如此,但我仍然在评论部分收到与USER1相同的错误。 这是视频底部的建议 “USER1我找到了,忘记改用户组了! --> USER2 转到管理面板,在您的用户部分中,在所选组部分中添加客户”。 我确实做到了,但没有成功,唯一的区别是我使用了迁移的 postgresql,他们使用了原始的 SQLight使用 PostgreSQL。 我在两个数据库中都有数据和表,但 PostgreSQL 适合一些老员工,而 SQLite 适合一切。 我已尝试使用此guide 将 SQLite 迁移到 PostgreSQL。 我已成功创建 SQLite 数据库的副本 但是当我将设置更改为 postgres 并尝试使用python manage.py migrate 时,它显示Running migrations: No migrations to apply. python manage.py loaddata db.json 用户已从 SQLite 迁移(我可以使用他们登录并得到错误,就像唯一的 SQlite 用户一样,如果我输入错误的用户或密码,它不允许我进入)但我没有看到任何如果我使用 IDE 查找 Postgresql 中的数据表 我在论坛上与其他人交谈过,但很多人说是装饰器文件有问题,但它确实只发生在数据库切换时。 我创建了一个新的 postgresql 数据库并尝试迁移所有内容(迁移并没有迁移所有内容)。比我尝试注册一个新帐户时,它在填写表单按下提交后给了我以下错误消息
DoesNotExist at /register/
Group matching query does not exist.
    我还像课程负责人一样创建了一个 AWS RDS postgreSQL 数据库,将其迁移并连接到服务器和设置中,但我仍然遇到同样的错误。 我也查看了用户组权限,并且源代码 SQLight 数据库在管理选项卡中没有与我的 postgresql 相同的权限 创建了一个全新的 Django 3 项目,全新的虚拟环境 0 我只复制了上一个项目中的所有内容作为文本,从以前的数据库中迁移了所有内容,我得到了同样的错误

【问题讨论】:

您确定您是从 django 管理员手动创建组,然后为他们分配用户。? 我不知道其他方法,所以我很确定。 不是其他方式。 “allowed_users”函数就是我所指的。基本上,根据视频,它期望组内的角色可以是员工、管理员或任何角色。那么您是否从 django 管理员组中创建了角色? 无论如何,我尝试在 postgres 和 sql 中运行你的代码,它对我来说工作得很好 我也有同样的问题,你调试了吗 【参考方案1】:

首先,我建议您使用内置的 django 身份验证应用程序,而不是自己创建一个 https://docs.djangoproject.com/en/3.0/topics/auth/,并且您可以使用 django-braces 应用程序,它具有一组惊人的类视图 mixin,用于什么我看到你正在尝试这样做,这个 mixin 会对你有很大帮助:https://django-braces.readthedocs.io/en/latest/access.html#grouprequiredmixin

【讨论】:

我只想修复这个错误,而不是我基本上已经设置好了。我不想删除整个身份验证应用程序并使用我以前从未听说过的全新库来执行此操作。但我将来可能会将它用于其他项目。【参考方案2】:

有可能,你的postgresql中没有任何组。所以请绕过这个装饰器并将一些组添加到您的 postgresql 数据库中。然后使用这个装饰器。

【讨论】:

正如我在“尝试解决”部分的评论中提到的“我遵循的指南创建了用户组,我在迁移的 PostgreSQL 数据库中也这样做了”【参考方案3】:

不确定我是否能提供帮助,但我有一台 Mac,使用 Django 并且在使用 PostgreSQL 时遇到了一些问题,所以我将分享我的想法。

首先,在我看来问题确实是与数据库的连接,而不是代码。我在 Django 代码中查找了您的错误,它说:

    def _get_response(self, request):
        """
        Resolve and call the view, then apply view, exception, and
        template_response middleware. This method is everything that happens
        inside the request/response middleware.
        """
        ...

        # Complain if the view returned None (a common error).
        if response is None:
            ...

            raise ValueError(
                "The view %s.%s didn't return an HttpResponse object. It "
                "returned None instead." % (callback.__module__, view_name)
            )

虽然我当然不是中间件方面的专家,但显然 Django 没有从您的数据库中接收数据。

我曾经在我的 Mac 上使用不同版本的 PostgreSQL 时遇到问题。您可以签入 /Library/PostgreSQL,我有两个目录(11 和 12),所以我必须小心我将哪个目录用于我的项目。在 PgAdmin 中,您可以看到这两个版本。如果您有旧版本或想要重新安装 PostgreSQL(这非常激烈,但会给您一张干净的床单),这里有一本很好的手册:https://medium.com/@zoefhall/effectively-uninstall-and-reinstall-psql-with-homebrew-on-osx-fabbc45c5d9d。你可以通过输入你的 Shell 来检查你的 Django 使用的版本:

python3 manage.py shell -c "from django.db import connection; print(connection.cursor().connection.server_version)"

对我来说,结果是 110005,转换为 11.0.5。

我也多次遇到 psycopg2 的问题。当你用 Django 设置你的虚拟环境时,安装它是必要的,所以如果你管理了它,那么可能就可以了。我遇到的问题是它找不到配置文件,对我来说最简单的解决方案是安装二进制版本 psycopg2-binary。但是如果你想在你的 Mac 上安装一个特定版本的 PostgreSQL,那么你需要把 pg_config 文件放在你的 PATH 中,参见https://www.psycopg.org/docs/install.html。

这就是我学到的,希望对你有点帮助。

【讨论】:

谢谢保罗,愿上帝保佑你!您解决了我的问题,正如您所说,问题确实是与数据库的连接【参考方案4】:

这就是我解决它的方法。

当视频说我必须在管理面板中创建用户组时,我做到了。 我只需要向该组添加属性。 Home › Authentication and Authorization › Groups › customer 添加用户允许执行的功能,例如:
...
accounts customer can view customer
...
然后我退出管理视图 我以正常方式登录,一切正常

【讨论】:

以上是关于SQLite 工作,但 PostgreSQL 迁移数据库导致错误 - Django 3.0的主要内容,如果未能解决你的问题,请参考以下文章

Django:将项目从 sqlite 迁移到 PostgreSQL 的最佳实践是啥

如何从 SQLite 迁移到 PostgreSQL (Rails)

在迁移中更改自动增量值(PostgreSQL 和 SQLite3)

Django:将数据从 SQLite 移动到 PostgreSQL

带有角膜宝石和 sqlite 的 Sinatra 项目。耙分贝:迁移不工作。已创建架构但无法生成测试数据

Django 迁移:sqlite3 开发数据库、Amazon Elastic Beanstalk 和 Amazon RDS postgresql 实时数据库