【问题标题】:Django IntegrityError even though I check for existing record即使我检查现有记录,Django IntegrityError
【发布时间】:2012-06-30 04:18:37
【问题描述】:

我将 uuid 设置为在模型中是唯一的,下面的代码应该可以防止任何重复问题,但如果 uuid 已经存在,它会生成一个 IntegrityError。

即使存在具有请求的 uuid 的视频对象,get 似乎也会返回 false。 知道为什么会发生这种情况吗?

try:
    v = Video.objects.get(uuid = video_id)
except Video.DoesNotExist:
    v = Video(uuid = video_id)
    v.save()

【问题讨论】:

  • uuid 是 Video 对象的主键吗?如果是,请尝试Video.objects.get(pk=video_id)pk 是引用表的主键的小技巧。
  • 不,它不是主键,但它也是唯一的

标签: python database django


【解决方案1】:

IntegrityError 是出现重复键之类的情况时将引发的预期异常。这就是你捕捉情况的方式。

你应该关注的是失败的查询:

v = Video.objects.get(uuid = video_id)

如果您知道video_id 确实存在一个视频对象,那么您应该检查以确保video_id 的类型正确。除此之外,其余的行为似乎都是意料之中的。

【讨论】:

  • 我也试过这个,在这种情况下它会产生一个 DoesNotExist 错误。我完全被难住了。 try: v = Video(uuid = uuid) except IntegrityError: v = Video.objects.get(uuid = uuid)
  • 您应该尝试打印video_id 值和type(video_id) 并确认它与数据库的值匹配。另外,从python manage.py shell,您是否可以只查询video_id
  • 是的,他们似乎都很好。但是 get 没有返回任何东西。这可能与 unicode 有关吗?
  • 这可能取决于您使用的特定数据库。 uuid 的值是否包含非 ascii 字符? video_id 的值是多少?您能否使用本机数据库客户端成功执行原始查询?
  • 使用 MySQL。 UUID 只是 ascii 文本,类似于“sds8sdf-sfdk8sdf-sdfdsl-78sdf8ss”。是的,我可以进行成功的原始查询。它只是在脚本中不起作用。
猜你喜欢
  • 2018-06-17
  • 1970-01-01
  • 2012-04-26
  • 2022-12-06
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多