我创建了以下模型:
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, .
答案 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并选择最适合您的文档,文档非常广泛。