Python/Django 处理错误 UNIQUE 约束

标签 python django database

美好的一天。

我正在编写一个小脚本,使用 Feedparser 提取 RSS 数据。

我让它工作到将我需要的所有内容提取到数据库并将其存储在那里的位置。

现在为了避免数据重复,我在模型中设置了 Unique = True。

当然,现在我正在处理错误

返回Database.Cursor.execute(自身,查询,参数) sqlite3.IntegrityError:唯一约束失败:jobrss_rssjob.link

好吧,这很好,它没有重复数据。但是,它会完全破坏脚本,因此它会停止。

显然,我现在需要为错误编写一个异常 - 这几乎是我陷入困境的地方,因为他们也向我抛出错误。

这是我的代码:

from __future__ import unicode_literals
import feedparser
from django.utils import timezone
import json
from django.db import IntegrityError

from jobrss.models import RSSJob

try:
        def run():

            sources = [
        "https://mybroadband.co.za/vb/external.php?type=RSS2&forumids=269",
        "http://www.bizcommunity.com/rssjobs.aspx?l=196&c=11&s=Developer&sm=1"
            ]
            data = []
            for url in sources:
                data.append(feedparser.parse(url))
                for data in data:
                    for post in data.entries:
                        title = post.title
                        link = post.link
                        add = RSSJob()
                        add.title = title
                        add.link = link
                        add.save()
                        print("Added successfully")
except IntegrityError:
    print("Data Already exists")

有什么建议可以改进吗?

哦,这些是错误。 当我在空数据库上运行脚本时:

(techvenv) Ronalds-MacBook-Pro:TWNEW burgundy$ python manage.py runscript rsspull
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Added successfully
Exception while running run() in 'scripts.rsspull'
Traceback (most recent call last):
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/feedparser.py", line 398, in __getattr__
    return self.__getitem__(key)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/feedparser.py", line 356, in __getitem__
    return dict.__getitem__(self, key)
KeyError: 'append'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django/core/management/__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django_extensions/management/email_notifications.py", line 63, in run_from_argv
    super(EmailNotificationCommand, self).run_from_argv(argv)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django_extensions/management/email_notifications.py", line 75, in execute
    super(EmailNotificationCommand, self).execute(*args, **options)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django_extensions/management/utils.py", line 59, in inner
    ret = func(self, *args, **kwargs)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django_extensions/management/commands/runscript.py", line 238, in handle
    run_script(mod, *script_args)
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/django_extensions/management/commands/runscript.py", line 148, in run_script
    mod.run(*script_args)
  File "/Users/burgundy/dev/Projects/TWNEW/scripts/rsspull.py", line 18, in run
    data.append(feedparser.parse(url))
  File "/Users/burgundy/dev/Projects/techvenv/lib/python3.6/site-packages/feedparser.py", line 400, in __getattr__
    raise AttributeError("object has no attribute '%s'" % key)
AttributeError: object has no attribute 'append

这是我再次运行它的时候:

django.db.utils.IntegrityError: UNIQUE constraint failed: jobrss_rssjob.link

亲切的问候。 :)

最佳答案

您的错误是您在定义和运行函数之前捕获了异常。您需要将 try... except block 移至 run() 函数内。

考虑一下:

>>> try:
        def run():
            print(1 / 0)
    except ZeroDivisionError:
        print "Can't divide by zero"

>>> run()
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
ZeroDivisionError: integer division or modulo by zero

发生这种情况的原因是,当我们定义一个函数时,Python 实际上并不运行该函数。因此,在我们定义函数时,1/0 不会引发任何错误。在这里,try... except block 只会捕获函数定义期间的任何错误。但是,当我们调用 run() 函数时,我们是在 try... except block 之外运行它。这就是我们收到错误的原因。


如何修复它:

try... except block 移至 run() 函数最内部的 for 循环内。示例:

def run():
    for url in sources:
        data.append(feedparser.parse(url))
        for data in data:
                for post in data.entries:
                    try:
                        title = post.title
                        ...
                        print("Added successfully")
                    except IntegrityError:
                        print("Data Already exists")

关于Python/Django 处理错误 UNIQUE 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47247746/

相关文章:

python - ValueError : The file could not be found with <pipeline. storage.PipelineCachedStorage 对象>

php - 用户隐藏个人信息的数据库结构

sql - 如何选择某一列上具有最大值的行

python - Django Jenkins 在处理到 Selenium 服务器时引发 WebDriverException

python - undefined symbol : PyUnicodeUCS2_Decode whilst trying to install psycopg2

django - 在 django + nginx + wsgi 中, "mysite.sock"是什么

javascript - 如何以正确的顺序显示日期? ( react native )

python - numpy中的随机单热矩阵

python - BS4 : How would I remove unncessary html tags and only keep the <p> and <ruby> tags?

使用 mod_wsgi 卡住 Django/Apache