【问题标题】:django+heroku+postgres error in createsuperuser command,its giving an error "psycopg2.errors.UndefinedTable: relation "users_profile" does not exist"createsuperuser 命令中的 django+heroku+postgres 错误,它给出错误“psycopg2.errors.UndefinedTable: 关系“users_profile”不存在”
【发布时间】:2019-11-17 14:34:48
【问题描述】:

我想用 postgresql 在 heroku 中部署我的 django 应用程序,一切顺利,makemigrations 和 migrate 运行良好,但是当我尝试创建超级用户时,它给了我错误

(youngmindsenv) E:\young_minds\heroku\youngminds>heroku run bash
Running bash on ? youngminds... up, run.8229 (Free)
~ $ python manage.py createsuperuser
Username (leave blank to use 'u21088'): johnson
Email address: johnson@gmail.com
Password:
Password (again):
Traceback (most recent call last):
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils
.py", line 85, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "users_profile" does not exist
LINE 1: INSERT INTO "users_profile" ("user_id", "image", "descriptio...
                    ^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/_
_init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/_
_init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/b
ase.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/auth/mana
gement/commands/createsuperuser.py", line 59, in execute
    return super().execute(*args, **options)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/core/management/b
ase.py", line 335, in execute
    output = self.handle(*args, **options)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/auth/mana
gement/commands/createsuperuser.py", line 179, in handle
    self.UserModel._default_manager.db_manager(database).create_superuser(**user
_data)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/auth/mode
ls.py", line 161, in create_superuser
    return self._create_user(username, email, password, **extra_fields)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/auth/mode
ls.py", line 144, in _create_user
    user.save(using=self._db)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/auth/base
_user.py", line 73, in save
    super().save(*args, **kwargs)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py
", line 729, in save
    force_update=force_update, update_fields=update_fields)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py
", line 769, in save_base
    update_fields=update_fields, raw=raw, using=using,
  File "/app/.heroku/python/lib/python3.6/site-packages/django/dispatch/dispatch
er.py", line 178, in send
    for receiver in self._live_receivers(sender)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/dispatch/dispatch
er.py", line 178, in <listcomp>
    for receiver in self._live_receivers(sender)

  File "/app/users/signals.py", line 9, in create_profile
    Profile.objects.create(user=instance) ####problem in this line

  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/manager
.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/query.p
y", line 417, in create
    obj.save(force_insert=True, using=self.db)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py
", line 729, in save
    force_update=force_update, update_fields=update_fields)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py
", line 759, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, upda
te_fields)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py
", line 842, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/base.py
", line 880, in _do_insert
    using=using, raw=raw)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/manager
.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/query.p
y", line 1125, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/sql/com
piler.py", line 1281, in execute_sql
    cursor.execute(sql, params)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils
.py", line 100, in execute
    return super().execute(sql, params)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils
.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._e
xecute)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils
.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils
.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/utils.py", lin
e 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils
.py", line 85, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "users_profile" does not exist
LINE 1: INSERT INTO "users_profile" ("user_id", "image", "descriptio...

我可以看到我的 signals.py 文件中有问题,但我不知道是什么导致了这个问题以及如何解决它

信号.py

from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from . models import Profile

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    else:
        pass

@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()

views.py

from django.shortcuts import render,redirect
from django.contrib import messages
from .forms import UserRegistrationForm,UserUpdateForm,ProfileUpdateForm
from django.contrib.auth.decorators import login_required
from django.views.generic import ListView
from .models import Profile
from blog.views import *
from django.contrib.auth import authenticate, login
from django.http import JsonResponse

# Create your views here.
def register(request):
    if request.method == "POST":
        form = UserRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')

            new_user = authenticate(username=form.cleaned_data['username'],
                                    password=form.cleaned_data['password1'])
            login(request, new_user)

        p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
        if form.is_valid():

            if  p_form.is_valid:

                p_form.save()
                messages.success(request,f'Account created! Welcome Young Minds family!')
                return redirect('blog-home')
    else:
        form = UserRegistrationForm()
        form_profile = ProfileUpdateForm()
    response = common_info()
    categories =  response["categories"]

    return render(request,"users/registration.html",{"form":form ,"form_profile":form_profile,"categories":categories})

def validate_username(request):
    username = request.GET.get('username', None)
    data = {
        'is_taken': User.objects.filter(username__iexact=username).exists()
    }
    if data['is_taken']:
        data['error_message'] = 'A user with this username "{}" already exists !'.format(username)

        return JsonResponse(data)

    email = request.GET.get('email', None)
    if email != "":
        data = {
            'is_taken': User.objects.filter(email__iexact=email).exists()
        }
        if data['is_taken']:
            data['error_message'] = '"{}" email id is already registered!'.format(email)
        return JsonResponse(data)



'''@login_required
def profile(request):

    user_post = Post.objects.filter(author__username=request.user)
    context = {}
    response = common_info()
    context["user_posts"] = user_post
    context['categories'] =  response["categories"]
    context['popular_posts'] =  response["popular_post"]

    return render(request,"users/profile.html",context)'''

class ProfileListView(ListView):
    model = Post
    template_name = 'users/profile.html'
    context_object_name = 'user_posts'
    ordering = ['-date_posted']
    paginate_by = 5

    def get_queryset(self):
        return Post.objects.filter(author__username=self.kwargs.get('username'))

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        response = common_info()
        context['categories'] =  response["categories"]
        context['popular_posts'] =  response["popular_post"]
        user = self.kwargs.get('username')
        context["description"] = Profile.objects.get(user__username__iexact=self.kwargs.get('username'))
        context['title'] = user.title() +"'s Profile"
        return context

@login_required
def profile_update(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
        if u_form.is_valid and p_form.is_valid:
            u_form.save()
            p_form.save()
            messages.success(request,f'Your account has been updated successfully!.')
            return redirect('profile' ,request.user)

    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)
    response = common_info()
    categories =  response["categories"]
    context = {"u_form":u_form,"p_form":p_form,"categories":categories,"title":"Update Profile"}
    return render(request,"users/profile_update.html",context)

请帮帮我!如何解决这个问题,如果需要任何额外的信息,我会更新。

更新


问题解决了,我的解决方法是

1) 删除了我的生产表,因为那里没有任何数据。 2) 在本地运行 makemigrations 命令 3)直接在heroku bash中运行迁移命令而不运行makemigrations

这样做问题就解决了!

希望这对将来的人有所帮助!感谢所有抽出时间对此发表评论和回答的人

【问题讨论】:

  • 运行 makemigrations 和 migrate 命令
  • @shafik 我已经完成了,但仍然遇到同样的错误
  • 澄清一下:运行makemigrations 本地。永远不应该有理由在 Heroku 上运行它。 migrate 必须在两个地方都运行。

标签: python django postgresql heroku psycopg2


【解决方案1】:

正如shafik 所说,你的错误可能是因为你跑了

python manage.py makemigrations

创建迁移跟踪文件,但您没有运行

python manage.py 迁移

根据使用先前命令创建的迁移历史文件创建/更改数据库。

【讨论】:

  • 我已准备好从数据库中删除我的表,那么现在我该如何从新开始。现在 makemigrations 和 migrate 已经完成,但我仍然在 createsuperuser 上收到错误。所以我想重新开始,要遵循的程序是什么
  • 使用以下命令删除所有迁移:stackoverflow.com/questions/56895898/… 然后运行python manage.py makemigrationspython manage.py migrate 您应该阅读simpleisbetterthancomplex.com/tutorial/2016/07/26/… 了解更多信息
  • 我都试过了,但是仍然给我同样的错误
猜你喜欢
  • 2022-07-20
  • 2021-07-22
  • 2022-01-26
  • 1970-01-01
  • 2021-07-30
  • 2016-07-05
  • 2020-03-06
  • 2011-07-23
  • 2012-09-22
相关资源
最近更新 更多