Python Peewee重置主键

时间:2013-03-21 16:12:50

标签: python peewee

在某些情况下,Python模块Peewee会在保存对象时重置(非整数)主键。我构建了这个例子来澄清:

#!/usr/bin/python

from peewee import *
import uuid

db = SqliteDatabase('./db/' + str(uuid.uuid4()) + '.db')

class A(Model):
    id = CharField(primary_key=True)
    def __init__(self):
        super(A, self).__init__()
        self.id = str(uuid.uuid4())
    class Meta:
        database = db

class B(A):
    name = CharField()    
    def __init__(self, name):
        super(B, self).__init__()
        self.name = name

A.create_table()
a = A()
print a.id
a.save(force_insert=True)
print a.id
print "--"    
B.create_table()
b = B(name='Test')
print b.id
b.save(force_insert=True)
print b.id

示例输出:

$ ./pkey.py 
0bd49fa9-c5cc-40e7-aff7-24e0b17247cb
0bd49fa9-c5cc-40e7-aff7-24e0b17247cb
--
2fe23bac-4cb2-46a2-827a-8a1c6395e665
1

现在,最后一行不应该是1,而是2fe ......作为上面的行。有趣的是,正如示例所示,这只发生在子对象上。

我在这里完全误解了什么吗?

2 个答案:

答案 0 :(得分:3)

我已经在GitHub上解决了这个问题并发布了修复程序。问题是由模型之间的主键字段继承中的错误引起的。

https://github.com/coleifer/peewee/issues/175

答案 1 :(得分:0)

我不是一个peewee专家,但浏览几个示例(examplecookbook),这些是定义数据库模式并实现数据库访问但不打算实现的类你的逻辑。它应该是这样的:

#!/usr/bin/python

from peewee import *
import uuid

db = SqliteDatabase('./db/' + str(uuid.uuid4()) + '.db')

class A(Model):
    id = CharField(primary_key=True)
    class Meta:
        database = db

class B(A):
    name = CharField()    

A.create_table()
a = A.create(id=uuid.uuid4())
print a.id
a.save(force_insert=True)
print a.id
print "--"    
B.create_table()
 b = B.create(id=uuid.uuid4(), name='Test')
print b.id
b.save(force_insert=True)
print b.id

查看示例和食谱。