SQLAlchemy继承阻止创建基本实例

时间:2014-07-28 12:00:36

标签: python sqlalchemy

我创建了以下模型:

class Person(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(1024), nullable=False)
    email = db.Column(db.String(250), nullable=True, unique=True)
    code = db.Column(db.String(10), nullable=False, unique=True)

在某些情况下,Person会变成系统用户。所以,我有以下模型:

class User(Person):
    password = db.Column(db.String(1024), nullable=False)

问题是,当我尝试从这样做的人创建用户时:

>>> person = Person(name='foobar', email='foobar@gmail.com', code='123123')
>>> db.session.add(person)
>>> db.session.commit()
>>> print person.id
4
>>> user = User(id=4, password='changeme')
>>> db.session.add(user)
>>> db.session.commit()
(IntegrityError) null value in column "name" violates not-null constraint
'INSERT INTO person (id, name, ....

问题是如何防止模型用户创建新的Person实例,因为数据库中已存在该实例?


UPDATE :尝试加入表继承时,我遇到了同样的问题。它不明白如何不创建Person的新实例

class Person(db.Model):

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(1024), nullable=False)
    email = db.Column(db.String(250), nullable=True, unique=True)
    code = db.Column(db.String(10), nullable=False, unique=True)
    person_type = db.Column(db.String(10), nullable=False)


    __mapper_args__ = {'polymorphic_on': 'person_type'}

class User(Person):
    __mapper_args__ = {'polymorphic_identity': 'recurvado'}

    id = db.Column(db.Integer, db.ForeignKey('arco.id'), primary_key=True)
    password = db.Column(db.String(1024), nullable=False)

问题是,当我尝试从这样做的人创建用户时:

>>> person = Person(name='foobar', email='foobar@gmail.com', code='123123')
>>> db.session.add(person)
>>> db.session.commit()
>>> print person.id
4
>>> user = User(id=4, password='changeme')
>>> db.session.add(user)
>>> db.session.commit()
(IntegrityError) null value in column "name" violates not-null constraint
'INSERT INTO person (id, name, .

1 个答案:

答案 0 :(得分:1)

有两种方法。简单的一个

class Person(object): #notice there's no db.Model here
    id = db.Column(db.Integer, primary_key=True)
    #the rest of the person columns follow

class User(Person):
    password = db.Column(db.String(1024), nullable=False)
    #other user specific attributes and columns

如果您不希望将Person类实例化为db对象本身,则上述情况很好。如果您真的想要这样,那么您应该查看http://docs.sqlalchemy.org/en/rel_0_9/orm/inheritance.html#single-table-inheritance并选择最适合您的文档,文档非常广泛。