2015-10-15 193 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)