2

在某些情况下,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... 如上一行。有趣的是,正如示例所示,这仅发生在子对象上。

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

4

2 回答 2

3

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

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

于 2013-03-27T15:57:08.867 回答
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

浏览示例和食谱。

于 2013-03-21T16:55:01.930 回答