【发布时间】:2018-02-23 13:45:12
【问题描述】:
我正在开发的assets django 应用程序在 SQLite 上运行良好,但我在删除/更新大量记录时遇到了性能问题,因此我正在过渡到 PostgreSQL 数据库。
为此,我从更新 theapp/settings.py 以配置 PostgreSQL 开始,从新的数据库开始并删除 assets/migrations/ 目录。然后我正在运行:
./manage.py makemigrations assets
./manage.py migrate --run-syncdb
./manage.py createsuperuser
我在注册的post_create 信号中调用了一个函数。它会在创建 Scan 对象时运行扫描。班级内assets.models.Scan:
@classmethod
def post_create(cls, sender, instance, created, *args, **kwargs):
if not created:
return
from celery.result import AsyncResult
# get the domains for the project, from scan
print("debug: task = tasks.populate_endpoints.delay({})".format(instance.pk))
task = tasks.populate_endpoints.delay(instance.pk)
违规代码:
from celery import shared_task
....
import datetime
@shared_task
def populate_endpoints(scan_pk):
from .models import Scan, Project,
from anotherapp.plugins.sensual import subdomains
scan = Scan.objects.get(pk=scan_pk) #<<<<<<<< django no like
new_entries_count = 0
project = Project.objects.get(id=scan.project.id)
....
引发的异常DoesNotExist:
debug: task = tasks.populate_endpoints.delay(2)
[2017-09-14 23:18:34,950: ERROR/ForkPoolWorker-8] Task assets.tasks.populate_endpoints[4555d329-2873-4184-be60-55e44c46a858] raised unexpected: DoesNotExist('Scan matching query does not exist.',)
Traceback (most recent call last):
File "/usr/local/lib/python3.6/site-packages/celery/app/trace.py", line 374, in trace_task
R = retval = fun(*args, **kwargs)
File "/usr/local/lib/python3.6/site-packages/celery/app/trace.py", line 629, in __protected_call__
return self.run(*args, **kwargs)
File "/usr/src/app/theapp/assets/tasks.py", line 12, in populate_endpoints
scan = Scan.objects.get(pk=scan_pk)
通过./manage.py shell 交互表明存在pk == 2 的Scan 对象:
>>> from assets.models import Scan
>>> Scan.objects.all()
<QuerySet [<Scan: ACME Web Test Scan>]>
>>> s = Scan.objects.all().first()
>>> s.pk
2
我唯一的猜测是,在调用 post_create 函数时,尽管调用了 save(),但 PostgreSQL 数据库中仍然不存在 Scan 对象。
SQLite 没有出现这个问题。
此外,我还没有在 stackoverflow 上找到相关的相关问题,因为 DoesNotExist 异常看起来相当通用并且是由许多事情引起的。
对此的任何想法将不胜感激。
【问题讨论】:
-
两个pk的类型一样吗?您尚未提供模型规格。如果您没有明确声明它,它应该是整数。但不确定从一个数据库迁移到另一个数据库时这是否会成为问题。
标签: python django postgresql exception celery