【发布时间】:2014-06-19 20:04:20
【问题描述】:
我收到以下错误:
django.db.utils.IntegrityError: duplicate key value violates unique constraint "record_coordinates_lat_lon_created_by_id_key"
DETAIL: Key (lat, lon, created_by_id)=(34.84000015258789, -111.80000305175781, 2) already exists.
背景:到目前为止,我一直在使用 MySQL 和 Django 1.4.3。现在我已经安装了 Postgres 9.3 和 Psycopg2 2.5.2。验证和 Syncdb 工作正常。未安装 South。
我运行了一个脚本(适用于 MySQL)。该脚本循环遍历 GPS 文件并将纬度/经度数据保存在坐标表中。
_coordinates, coordinates_created = Coordinates.objects.get_or_create(
lat=round(group[u'lat'], Coordinates.max_decimal_places),
lon=round(group[u'lon'], Coordinates.max_decimal_places),
created_by=self._user,
modified_by=self._user,
date_created=datetime.now(), # See Update 2 addition below.
)
我在模型定义中有一个unique_together = ('lat', 'lon', ) 约束。一些坐标是相同的(因此使用 get_or_create())。我发现自己摸不着头脑,因为它应该“获取”坐标而不是尝试“创建”新坐标。
这个网站上关于 Postgres 和 Django 的大多数问题几乎都不可避免地提到了 South。我需要South,还是这里发生了其他事情?我只是想在不安装迁移的情况下进行快速而肮脏的测试。
更新 1:
我尝试的其他方法是在 suggestion of another post 上的 Postgres 中运行:SELECT setval('django_content_type_id_seq', (SELECT MAX(id) FROM django_content_type));。错误仍然存在。
更新 2: 好的,我没有意识到我需要将所有坐标字段都放在默认字典中。坐标模型包含另一个字段 'date_created=models.DateTimeField(auto_now_add=True)'
我发现以下blog post 似乎可以解释当您使用“auto_now_add=True”时 get_or_create() 会中断。现在最大的问题是如何在不破坏 get_or_create() 的情况下使用 auto_now_add?
【问题讨论】:
-
您正在“获取”具有您指定的
lat和lon的坐标,以及 具有created_by和modified_by作为self._user.会不会是数据库中存在一个坐标,lat和lon相同,但created_by或modified_by不同? -
我用来填充数据库的脚本只有一个分配的用户。即使用户不同,也没有关系,因为 (lat, lon) 对必须是唯一的,与添加关联的用户无关。
标签: python mysql django postgresql psycopg2