![](/img/trans.png)
[英]django.db.utils.ProgrammingError: operator does not exist: character varying = integer
[英]Django and Postgresql operator does not exist: integer = character varying
我有以下兩種模型:
class CachedRecord(models.Model):
recordname = models.CharField(max_length=100,primary_key=True)
recordcount = models.IntegerField()
def __unicode__(self):
return self.recordname
class CachedRecordData(models.Model):
record = models.ForeignKey(CachedRecord)
data = models.CharField(max_length=100)
def __unicode__(self):
return self.data
當我嘗試從管理面板中刪除CachedRecord時,出現此錯誤:
ProgrammingError at /admin/myapp/cachedrecord/
operator does not exist: integer = character varying
LINE 1: ...ON ( "myapp_cachedrecorddata"."record_id" = "myapp...
^
HINT: No operator matches the given name and argument type(s).
You might need to add explicit type casts.
我發現了很多問題(因此可能是重復的),但是我真的不明白任何答案。
heroku,postgreSQL,django,注釋,美味:沒有運算符匹配給定的名稱和參數類型。 您可能需要添加顯式類型轉換
沒有運算符匹配給定的名稱和參數類型。 您可能需要添加顯式類型轉換。 -Netbeans,Postgresql 8.4和Glassfish
我在哪里需要在Django中添加這些鑄件?
問/回答這個問題已經有兩年了,但是我今天遇到了同樣的問題,並找到了可以接受的答案,而“ easy”並沒有真正解決數據庫表類型意外的根本問題。 Django的構建目的是“正確管理鍵”,以供用戶定義的主鍵使用。
我用ProgrammingError: operator does not exist: character = uuid
消息遇到了類似的問題ProgrammingError: operator does not exist: character = uuid
。
在將Django項目的MySQL數據庫遷移到PostgreSQL之后,我遇到了這個問題。 MySQL沒有本地UUID字段,因此它表示帶有VARCHAR(32)
的models.UUIDField
。 遷移后,PostgreSQL中的字段類型也被創建為character(32)
。 為了解決該問題,我必須使用PostgreSQL命令行更改字段類型:
ALTER TABLE my_table ALTER COLUMN my_field TYPE uuid USING uuid::uuid;
這會將字段類型轉換為Django期望找到的PostgreSQL的本地UUID類型。
我猜想OP已經使用Django默認創建的整數ID字段(如果未定義primary_key)將CachedRecord
表已經添加到CachedRecordData
之后,將recordname
字段添加到了CachedRecord
中。 在將新的記錄recordname
字段添加為主鍵之后,OP需要更新現有關系以使用新的主鍵。
您已將一個字符字段( recordname
)設置為CachedRecord
的主鍵。
Django為CachedRecordData
創建了名為id
的自動主鍵(類型為整數),因為模型定義中未指定主鍵。
現在,當您嘗試刪除CachedRecord
,django正在創建一個主鍵查找,以確保刪除所有相關的CachedRecordData
實例,並且由於一個鍵是一個字符而另一個鍵是一個整數-數據庫正在給出此錯誤。
解決此問題的最簡單方法是從recordname
刪除primary_key=True
,然后讓django正確管理密鑰。 您始終可以在該列上添加索引或其他約束(例如,設置unique=True
)。
您在這里也有類似的問題:
def __unicode__(self):
return self.recordname+":"+self.recordcount
您正在使用self.recordcount
添加字符串':'
,這將導致TypeError
異常,因為您無法將字符串與數字組合在一起:
>>> ':'+3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
要解決此問題:
def __unicode__(self):
return u'{}:{}'.format(self.recordname, self.recordcount)
我想我為您找到了解決方案。 我完全理解並尊重其他人在這里所說的關於使用Integer字段作為主鍵的說法,默認情況下,這的確是Django所做的。 結果,如果可以更改數據庫的結構,那么請先這樣做!
但是,如果您像我一樣,最終遇到這樣的問題,並且使用Django的默認值對您來說不是一個選擇,那么我就更改了主鍵的字段類型。 最初我有:
Username = models.CharField(max_length=1024, primary_key=True, unique=True)
改為將其更改為TextField!
Username = models.TextField(max_length=1024, primary_key=True, unique=True)
這為我解決了這個問題,我想這可能是Django嘗試將charfield作為主鍵構造/索引的方式的錯誤嗎? 我不確定。
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.