在我了解PonyORM的entity inheritance期间,由于我的好奇,我实施了以下内容:
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上进行了测试。
最初,我想做的是
例如,汤姆作为教授和汤姆作为学生应该有所不同。
我认为它与不同的db_session问题有关但在这种情况下,我该如何检索Person['Student', 'tom']
或Student[None, 'tom']
?他们有不同的方式将classtype
和name
作为PrimaryKey吗?
有人可以告诉我,我需要尝试什么?我错过了什么吗?
p.s。,我在sqlite和PostgresSQL 9.5.1上测试过它。
答案 0 :(得分:1)
感谢您的提问,这是一个错误而我fixed。
我们之前没有发现它,因为通常鉴别器列不包含在主键中。主键应包含唯一值,并且鉴别器列值对于相同类型的所有对象都是相同的。