2

在学习PonyORM 上的实体继承期间,出于好奇,我实现了以下内容:

from pony.orm import *


db = Database()


class Person(db.Entity):
    classtype = Discriminator(str)
    name = Required(str)
    PrimaryKey(classtype, name)


class Student(Person):
    professors = Set('Professor')


class Professor(Person):
    students = Set('Student')


db.bind("sqlite", "entity.sqlite", create_db=True)
db.generate_mapping(create_tables=True)

with db_session:
    student_tom = Student(name='tom')
    print(student_tom)
print(student_tom)

with db_session:
    tom = Person['Student', 'tom']
    print(tom)
print(tom)

我期望的输出如下:

Student['Student',u'tom']
Student['Student',u'tom']
Student['Student',u'tom']
Student['Student',u'tom']

但是,实际结果如下:

Student['Student',u'tom']
Student['Student',u'tom']
Student[None,u'tom']
Student[None,u'tom']

我在 IPython 等交互式控制台上对其进行了测试,并作为 python 文件运行。但是,两个结果是一样的。它在 Python 2.7.10 和 Python 3.6.0 上进行了测试。

本来我想做的是

  • 将 name 和 classtype 对作为 person 的唯一标识符。

例如,作为教授的汤姆和作为学生的汤姆应该是不同的。

我认为这与不同的 db_session 问题有关,但在这种情况下,我该如何检索Person['Student', 'tom']Student[None, 'tom']?他们有不同的制作方法classtypename作为主键吗?

有人可以告诉我我需要尝试什么吗?我错过了什么?

ps,我已经在 sqlite 和 PostgresSQL 9.5.1 上测试过了。

4

1 回答 1

1

感谢您的询问,这是一个错误,我已修复它。

我们之前没有发现它,因为通常鉴别器列不包含在主键中。主键应该包含唯一值,并且鉴别器列值对于所有相同类型的对象都是相同的。

于 2017-03-21T13:02:32.820 回答