2015-10-15 191 views
1

我使用優秀的PeeWee模塊將一些Id和主機名保存到MySQL表中。 我想'clientId'(這是一個IntegerField)是主鍵,但我似乎需要使用save(force_insert=True)來使它插入 - 否則我什麼也沒有添加到表中。我沒有收到任何錯誤消息。 我認爲這只是在primary_key字段不是Integer時才需要的。 我指的是文檔 - (https://peewee.readthedocs.org/en/2.0.2/peewee/fields.html#non-integer-primary-keysPeeWee Integer主鍵需要force_insert = True

我的模型: -

class BaseModel(peewee.Model): 
    class Meta: 
     database = db 

class Client(BaseModel): 
    clientId = peewee.IntegerField(primary_key=True) 
    clientName = peewee.TextField() 
    isDeletedClient = peewee.BooleanField(default=False) 

#Create object to insert using collected data... 
clientEntry = Client(clientId=clientId, 
        clientName=clientName, 
        isDeletedClient=isDeletedClient) 

#clientEntry.save() # <-- Nothing gets inserted 
clientEntry.save(force_insert=True) # <-- Works. 
+0

*的方式peewee決定是否對一個UPDATE歸結爲檢查主鍵值是否爲無做一個INSERT。如果爲None,它將執行插入操作,否則它會對現有值進行更新。*因此,您的'clientId'是否等於'None'? –

+0

嗨,傑夫。無論文檔如何,無論主鍵是否存在,都將發佈INSERT。我認爲你試圖用現有的主鍵插入記錄。你可以嘗試使用自動遞增的主鍵http://docs.peewee-orm.com/en/latest/peewee/api.html#PrimaryKeyField – discort

回答

-1

三江源這麼多的響應。我相信我錯誤地使用了save()方法。而不是save(),如果記錄已經存在一個主鍵,可以進行更新,我應該使用create(),因爲我的腳本總是創建一個新的空表,然後填充它。

所以現在我的模型仍然是相同的,但插入行成爲...

clientEntry = Client.create(clientId=clientId, 
          clientName=clientName, 
          isDeletedClient=isDeletedClient) 
+0

這是不正確的。是的,'create()'調用'save(force_insert = True)',但你不需要這樣做。如果你想自動遞增主鍵,只需使用'PrimaryKeyField'。 – coleifer

+0

我確定我無意中誤導了你,但我並不想在ClientId主鍵上「自動增加」。 ClientId是整數,它唯一標識每個'客戶',但我不希望數據庫分配它們,因爲我將它們作爲客戶端信息的一部分收集在我的腳本中。我只是想讓ClientId成爲主鍵,並發現save()沒有用我的原始設置插入任何東西,因爲我的表每次都是空的。 – JazzyGeoff

+0

嘿!好,那麼'save(force_insert = True)'或'create()'是你的朋友:) – coleifer

0

這是一個微妙的一點,但如果你想自動遞增主鍵字段,你應該使用PrimaryKeyField而比IntegerField(primary_key=True)

這應該可以解決這個問題:

class Client(BaseModel): 
    clientId = peewee.PrimaryKeyField() 
    clientName = peewee.TextField() 
    isDeletedClient = peewee.BooleanField(default=False)