flask-sqlalchemy使用
简单的例子这里已经有了
中文
这里记录一下平时我遇到的一些问题
一对多
需求:一个问题对应多个回复
下面给出代码(字段不完整)
1class Questions(db.Model): 2 __tablename__ = 'questions' 3 id = db.Column(db.Integer, primary_key=True) 4 title = db.Column(db.String(50), nullable=False) 5 content = db.Column(db.Text, nullable=False) 6 7 def __init__(self,title,content): 8 self.title = title 9 self.content = content 10 11 def __repr__(self): 12 return "<Questions %r>" % self.title 13 14 15class Replies(db.Model): 16 __tablename__ = 'replies' 17 id = db.Column(db.Integer, primary_key=True) 18 content = db.Column(db.Text, nullable=False) 19 question_id = db.Column(db.Integer, db.ForeignKey('questions.id', 20 ondelete="CASCADE")) 21 replies = db.relationship('Questions', 22 backref=db.backref('replies', 23 cascade='all,delete-orphan', 24 lazy='dynamic', 25 order_by='Replies.time') 26 ) 27 28 def __init__(self, content): 29 self.content = content 30 31 def __repr__(self): 32 return "<Replies %r>" % self.content
会发现这样的两行(虽然实际上有好几行)
1 question_id = db.Column(db.Integer, db.ForeignKey('questions.id', 2 ondelete="CASCADE")) 3 replies = db.relationship('Questions', 4 backref=db.backref('replies', 5 cascade='all,delete-orphan', 6 lazy='dynamic', 7 order_by='Replies.time') 8 )
question_id为外键,关联着questions这个数据表
replies这一行我习惯用反代,也就是backref=db.backref
调用
1question = Questions.query.filter_by(id=1).first() 2print(question.replies) # 输出该问题的回复 3print(question.replies.content) # 错误 4for reply in question.replies: 5 print(reply.content) # 正确 6reply = Replies.query.filter_by(id=1).first() 7print(reply.question_id) # 输出该回复的所属问题 8print(reply.question_id.title)
级联删除
也就是删除一个问题,也会将该问题下的所有回复删除,而删除问题下的回复将不会影响到具体问题
具体请google sqlalchemy cascade
经过测试,上面代码可级联删除回复,而不是将外键置空
