我收到以下錯誤:如何解決django.db.utils.IntegrityError:重複鍵值違反唯一約束?
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的大多數問題幾乎都不可避免地提到了南方。我需要南方還是其他地方?我只是想在不安裝遷移的情況下做一個快速而骯髒的測試。
更新1: 我試過的其他東西是運行:SELECT setval('django_content_type_id_seq', (SELECT MAX(id) FROM django_content_type));
在Postgres的suggestion of another post。錯誤仍然存在。
更新2: 好吧,我沒有意識到我需要把所有的座標字段放在默認字典中。座標模型包含另一場 'DATE_CREATED = models.DateTimeField(auto_now_add = TRUE)'
我發現下面的blog post,似乎解釋get_or_create()打破,當你使用 'auto_now_add =真'。現在最大的問題是如何使用auto_now_add而不破壞get_or_create()?
你「獲得」有'lat'和座標'lon'如你所指定的,*以及*具有'created_by'和'modified_by'作爲'self._user'。難道是在數據庫中存在一個具有相同'lat'和'lon'但是不同的'created_by'或'modified_by'的座標嗎? – univerio
我用來填充數據庫的腳本只有一個它分配的用戶。即使用戶不同,也不要緊,因爲(經緯度)對必須獨立於與加法相關的用戶而獨立。 –