gpt4 book ai didi

Django 测试 : setUpTestData on Postgres throws: "Duplicate key value violates unique constraint"

转载 作者:行者123 更新时间:2023-11-29 11:22:34 27 4
gpt4 key购买 nike

我在单元测试中遇到了数据库问题。我认为这与我使用 TestCase 和 setUpData 的方式有关。

当我尝试使用某些值设置我的测试数据时,测试会抛出以下错误:

django.db.utils.IntegrityError: duplicate key value violates unique constraint 

...

psycopg2.IntegrityError: duplicate key value violates unique constraint "InventoryLogs_productgroup_product_name_48ec6f8d_uniq"
DETAIL: Key (product_name)=(Almonds) already exists.

我更改了所有主键,它似乎运行良好。它似乎不会影响任何测试。

但是,我担心我做错了什么。当它第一次发生时,我在我的应用程序上撤消了大约一个小时的工作(对于新手来说不是那么多代码),这纠正了问题。

然后,当我重新写回更改时,同样的问题再次出现。测试用例粘贴在下面。该问题似乎是在我添加 sortrecord 项目后出现的,但与它上面的项目相对应。

我不想在我的测试中继续检查和更改主键和 url,所以如果有人发现我使用它的方式有问题,请帮助我。谢谢!

测试用例

class DetailsPageTest(TestCase):


@classmethod
def setUpTestData(cls):

cls.product1 = ProductGroup.objects.create(
product_name="Almonds"
)
cls.variety1 = Variety.objects.create(
product_group = cls.product1,
variety_name = "non pareil",
husked = False,
finished = False,
)

cls.supplier1 = Supplier.objects.create(
company_name = "Acme",
company_location = "Acme Acres",
contact_info = "Call me!"
)

cls.shipment1 = Purchase.objects.create(
tag=9,
shipment_id=9999,
supplier_id = cls.supplier1,
purchase_date='2015-01-09',
purchase_price=9.99,
product_name=cls.variety1,
pieces=99,
kgs=999,
crackout_estimate=99.9
)
cls.shipment2 = Purchase.objects.create(
tag=8,
shipment_id=8888,
supplier_id=cls.supplier1,
purchase_date='2015-01-08',
purchase_price=8.88,
product_name=cls.variety1,
pieces=88,
kgs=888,
crackout_estimate=88.8
)
cls.shipment3 = Purchase.objects.create(
tag=7,
shipment_id=7777,
supplier_id=cls.supplier1,
purchase_date='2014-01-07',
purchase_price=7.77,
product_name=cls.variety1,
pieces=77,
kgs=777,
crackout_estimate=77.7
)

cls.sortrecord1 = SortingRecords.objects.create(
tag=cls.shipment1,
date="2015-02-05",
bags_sorted=20,
turnout=199,
)

cls.sortrecord2 = SortingRecords.objects.create(
tag=cls.shipment1,
date="2015-02-07",
bags_sorted=40,
turnout=399,
)
cls.sortrecord3 = SortingRecords.objects.create(
tag=cls.shipment1,
date='2015-02-09',
bags_sorted=30,
turnout=299,
)

模型

from datetime import datetime

from django.db import models
from django.db.models import Q


class ProductGroup(models.Model):
product_name = models.CharField(max_length=140, primary_key=True)

def __str__(self):
return self.product_name

class Meta:
verbose_name = "Product"

class Supplier(models.Model):
company_name = models.CharField(max_length=45)
company_location = models.CharField(max_length=45)
contact_info = models.CharField(max_length=256)

class Meta:
ordering = ["company_name"]

def __str__(self):
return self.company_name

class Variety(models.Model):
product_group = models.ForeignKey(ProductGroup)
variety_name = models.CharField(max_length=140)
husked = models.BooleanField()
finished = models.BooleanField()
description = models.CharField(max_length=500, blank=True)

class Meta:
ordering = ["product_group_id"]
verbose_name_plural = "Varieties"

def __str__(self):
return self.variety_name


class PurchaseYears(models.Manager):

def purchase_years_list(self):
unique_years = Purchase.objects.dates('purchase_date', 'year')
results_list = []
for p in unique_years:
results_list.append(p.year)
return results_list


class Purchase(models.Model):
tag = models.IntegerField(primary_key=True)
product_name = models.ForeignKey(Variety, related_name='purchases')
shipment_id = models.CharField(max_length=24)
supplier_id = models.ForeignKey(Supplier)
purchase_date = models.DateField()
estimated_delivery = models.DateField(null=True, blank=True)
purchase_price = models.DecimalField(max_digits=6, decimal_places=3)
pieces = models.IntegerField()
kgs = models.IntegerField()
crackout_estimate = models.DecimalField(max_digits=6,decimal_places=3, null=True)
crackout_actual = models.DecimalField(max_digits=6,decimal_places=3, null=True)
objects = models.Manager()
purchase_years = PurchaseYears()
# Keep manager as "objects" in case admin, etc. needs it. Filter can be called like so:
# Purchase.objects.purchase_years_list()
# Managers in docs: https://docs.djangoproject.com/en/1.8/intro/tutorial01/

class Meta:
ordering = ["purchase_date"]

def __str__(self):
return self.shipment_id

def _weight_conversion(self):
return round(self.kgs * 2.20462)
lbs = property(_weight_conversion)

class SortingModelsBagsCalulator(models.Manager):

def total_sorted(self, record_date, current_set):
sorted = [SortingRecords['bags_sorted'] for SortingRecords in current_set if
SortingRecords['date'] <= record_date]
return sum(sorted)


class SortingRecords(models.Model):
tag = models.ForeignKey(Purchase, related_name='sorting_record')
date = models.DateField()
bags_sorted = models.IntegerField()
turnout = models.IntegerField()
objects = models.Manager()

def __str__(self):
return "%s [%s]" % (self.date, self.tag.tag)

class Meta:
ordering = ["date"]
verbose_name_plural = "Sorting Records"

def _calculate_kgs_sorted(self):
kg_per_bag = self.tag.kgs / self.tag.pieces
kgs_sorted = kg_per_bag * self.bags_sorted
return (round(kgs_sorted, 2))
kgs_sorted = property(_calculate_kgs_sorted)

def _byproduct(self):
waste = self.kgs_sorted - self.turnout
return (round(waste, 2))
byproduct = property(_byproduct)

def _bags_remaining(self):
current_set = SortingRecords.objects.values().filter(~Q(id=self.id), tag=self.tag)
sorted = [SortingRecords['bags_sorted'] for SortingRecords in current_set if
SortingRecords['date'] <= self.date]
remaining = self.tag.pieces - sum(sorted) - self.bags_sorted
return remaining
bags_remaining = property(_bags_remaining)

编辑

对于整数,它也会失败,就像这样。

django.db.utils.IntegrityError: duplicate key value violates unique constraint "InventoryLogs_purchase_pkey"
DETAIL: Key (tag)=(9) already exists.

更新

所以我应该早点提到这一点,但我完全忘记了。我有两个使用相同数据的单元测试文件。只是为了好玩,我将 setUpTestData() 的两个实例中的主键匹配到不同的值,果然,我得到了同样的错误。

在我向其中一个添加更多数据之前,这两个设置并排运行良好。现在,他们似乎需要不同的值(value)观。我想您只能长时间使用重复数据才能逃脱。

最佳答案

我在没有任何重复数据的情况下继续收到此错误,但我能够通过初始化对象并调用 save() 方法而不是通过 Model 创建对象来解决问题.objects.create()

换句话说,我是这样做的:

@classmethod
def setUpTestData(cls):
cls.person = Person(first_name="Jane", last_name="Doe")
cls.person.save()

取而代之的是:

@classmethod
def setUpTestData(cls):
cls.person = Person.objects.create(first_name="Jane", last_name="Doe")

关于Django 测试 : setUpTestData on Postgres throws: "Duplicate key value violates unique constraint",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30776790/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com