Return None 作为 PonyORM 实体继承中的类类型
Return None as classtype in entity inheritance on PonyORM
在了解entity inheritance 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.
上测试
本来我想做的是
- 将名称和类类型配对作为人员的唯一标识符。
例如,作为教授的 Tom 和作为学生的 Tom 应该是不同的。
我认为它与不同的 db_session 问题有关,但在那种情况下,我如何检索 Person['Student', 'tom']
或 Student[None, 'tom']
?他们有不同的方法将 classtype
和 name
作为主键吗?
有人可以告诉我我需要尝试什么吗?我错过了什么吗?
p.s., 我已经在 sqlite 和 PostgresSQL 9.5.1 上测试过了。
感谢您的询问,这是一个错误,我 fixed 它。
我们没有早点发现它,因为通常鉴别器列不包含在主键中。主键应包含唯一值,鉴别器列值对于同一类型的所有对象都是相同的。
在了解entity inheritance 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.
上测试本来我想做的是
- 将名称和类类型配对作为人员的唯一标识符。
例如,作为教授的 Tom 和作为学生的 Tom 应该是不同的。
我认为它与不同的 db_session 问题有关,但在那种情况下,我如何检索 Person['Student', 'tom']
或 Student[None, 'tom']
?他们有不同的方法将 classtype
和 name
作为主键吗?
有人可以告诉我我需要尝试什么吗?我错过了什么吗?
p.s., 我已经在 sqlite 和 PostgresSQL 9.5.1 上测试过了。
感谢您的询问,这是一个错误,我 fixed 它。
我们没有早点发现它,因为通常鉴别器列不包含在主键中。主键应包含唯一值,鉴别器列值对于同一类型的所有对象都是相同的。