Python+;SqlAlchemy';初始';使用单表继承

Python+;SqlAlchemy';初始';使用单表继承,python,inheritance,sqlalchemy,Python,Inheritance,Sqlalchemy,有炼金术方面的问题 我已经定义了我的数据库,相关部分如下 class Person(Base): __tablename__ = 'PERSON' # id = Column(Integer, primary_key=True) person_type = Column(String(32), nullable=False) name = Column(String(50)) address = Column(String(120)) ph

有炼金术方面的问题

我已经定义了我的数据库,相关部分如下

class Person(Base):
    __tablename__ = 'PERSON'
    #
    id = Column(Integer, primary_key=True)
    person_type = Column(String(32), nullable=False)
    name = Column(String(50))
    address = Column(String(120))
    phonenum = Column(String(20))
    __mapper_args__ = {'polymorphic_on':person_type}

#

class Student(Person):
    __mapper_args__ = {'polymorphic_identity': 'Student'}
    dob = Column(Date)
我还有“Person”的其他子类。我对“init”的外观有问题。我最后一次尝试是

对于“人”

def __init__(self, a_name, a_address, a_phonenum, a_person_type = None):
    self.name = a_name
    self.address = a_address
    self.phonenum = a_phonenum
而对于“学生”

def __init__ (self, a_name, a_address,a_phonenum, a_dob=None, a_stud_caregiver_id=None, a_person_type = 'Student'):
    self.name = a_name
    self.address = a_address
    self.phonenum = a_phonenum
    self.dob = a_dob
    self.stud_caregiver_id = a_stud_caregiver_id
    self.person_type = a_person_type
  • 但是,虽然这创建了数据库,但当我开始“初始化”我的学生时,我得到的信息是
sqlalchemy.exc.InvalidRequestError:一个或多个映射程序未能初始化-无法继续初始化其他映射程序。最初的异常是:应为类对象,获得了“表('PERSON',元数据(bind=None)

我尝试过使用/不使用person\u type参数,但实际上,我只是在黑暗中拍摄


我显然做了一些愚蠢的事情,但是什么?谢谢!

一般来说,你想调用基类的init(或者使用
super
)。例如
Student.\uu init(self,require,args)
。我不知道
sqlalchemy
是否是这样,但这是相当标准的。通常情况下,您不需要编写具有基本功能的
\uuuuu init\uuuuu
,因为sqlalchemy已经提供了一个仅用于关键字参数的构造函数,该构造函数只分配给给定的属性。如果需要进一步的逻辑,请实现首先,然后(按照@mgilson的建议)添加对父构造函数的调用:
Base.\uuuu init\uuuu(self,**kwargs)
。我能够用这些模型(包括给定的构造函数)创建一个数据库没有任何问题。你能给我们一个完整的python脚本,我们可以运行它来复制问题吗?谢谢大家的评论。我留下了INIT方法,因为我(还)不知道是否手工添加person_类型。Mark-我可以创建数据库好的,我只是不能用INIT加载它(是我的还是自动的)。最近的尝试是…>>>>新学生=学生(“约翰·布朗”,“1号大街”,“09 123 4567”),这让我得到了…回溯(最近一次调用):文件“”,第1行,在新学生=学生(“约翰·布朗”,“1号大街”,“09 123 4567”)类型错误:uuu init_uuuu()接受1个位置参数,但给出了4个位置参数