Когда я узнал о наследовании сущностей в 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.
Изначально я хотел сделать
- сделать пару имени и типа класса уникальным идентификатором человека.
Например, должно быть по-разному между Томом как профессором и Томом как студентом.
Я думал, что это связано с другой проблемой db_session, но в таком случае, как я могу получить Person['Student', 'tom']
или Student[None, 'tom']
? Есть ли у них другой способ сделать classtype
и name
первичным ключом?
Может кто-нибудь сказать мне, что мне нужно попробовать? Я что-то пропустил?
p.s., я тестировал его на sqlite и PostgresSQL 9.5.1.