python - SQLite 工作,但 PostgreSQL 迁移数据库导致错误 - Django 3.0
问题描述
情况
- 我已经用几个应用程序构建了 Django 3.0、PostgreSQL 11、macOS 项目。
- 我已经根据以下课程创建了帐户应用程序,它是github
- 比我创建了一个身份验证应用程序
acc
- 所有这些都在SQLite数据库中完成
- 以前我已经为早期应用程序尝试了一个PostgreSQL数据库,它运行良好
- 但是现在当我在 settings.py 文件中将SQLite切换到PostgreSQL时出现错误,我尝试登录
- 如果我将 settings.py 切换回SQLite ,一切正常(例如:身份验证、使用用户登录、用户使用自己的设置在网站上执行操作)
- 我使用 decorators.py 来保持登录用户访问登录和注册页面,当我切换到 postgresql 时会出错。我只在这里使用
HttpResponse
错误消息包含
装饰器.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 ...
...
试图解决
- 我遵循的指南创建了我在迁移的 postgreSQL 数据库中也做过的用户组,但我仍然在评论部分收到与 USER1 相同的错误。
- 这是视频底部的建议
- “USER1我找到了,我忘记更改用户组了!
- --> USER2 转到管理面板,然后在您的用户部分中,在所选组部分中添加客户”。
- 我已经完全做到了,但它没有起作用,唯一的区别是我使用了迁移的 postgresql,他们使用了原始的 SQLight .
- 我在两个数据库中都有数据和表,但一些老员工使用PostgreSQL ,所有东西都使用SQLite。
- 我尝试使用本指南将SQLite迁移到PostgreSQL。
- 我已成功创建 SQLite 数据库的副本
- 但是当我将设置更改为 postgres 并尝试
python manage.py migrate
时说Running migrations: No migrations to apply.
python manage.py loaddata db.json
- 用户已从 SQLite 迁移(我可以使用他们登录并得到错误,就像唯一的 SQlite 用户一样,如果我输入错误的用户或密码,它不允许我进入),但我没有看到任何数据表在 Postgresql 中,如果我用 IDE 查找它
- 我在论坛上与其他人交谈过,但很多人说这是有问题的装饰器文件,但它只发生在数据库切换时。
- 我创建了一个新的 postgresql 数据库,并尝试迁移所有内容(迁移尚未迁移所有内容)。比我尝试使用新帐户注册时,它在填写表单按下提交后给了我以下错误消息
DoesNotExist at /register/
Group matching query does not exist.
- 我还像课程负责人一样创建了一个 AWS RDS postgreSQL 数据库,将其迁移并连接到服务器和设置中,但我仍然遇到同样的错误。
- 我也查看了用户组权限,并且源代码 SQLight 数据库在管理选项卡中没有给出与我的 postgresql 相同的权限
- 创建了一个全新的 Django 3 项目,全新的虚拟环境 0 我只复制了上一个项目中的所有内容作为文本,从以前的数据库中迁移了所有内容,我得到了同样的错误
解决方案
不确定我能帮忙,但我有一台 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。
这就是我学到的,希望对你有一点帮助。
推荐阅读
- angular - 使用路由解析器将静态数据传递给 Angular 8 中的路由组件是一种好习惯吗?
- java - 如何对具有相同表结构的 2 个数据库使用相同的对象模型?
- amazon-web-services - 如何在使用 salesforce apex 时将较大的文件(大于 12 MB)上传到 aws s3 存储桶
- r - 遍历 R 中列表中包含的数据帧的问题
- java - 添加通过用户输入决定的数组元素
- vba - 真的没有办法计算连接到 OLAP 数据源的 Slicer 中 Visible Slicer Items 的数量吗?
- sql - PostgreSQL - 查询表中列中的关键字模式
- pentaho - 是否可以用 Pentaho BI Server 中的社区文件存储库替换 Jackrabbit 存储库
- rxjs - Axios 上的 RxJS Observable 如何访问响应
- c# - C#的C++ qsort算法?