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
经过测试,上面代码可级联删除回复,而不是将外键置空

作者: honmaple
链接: https://honmaple.me/articles/2016/03/flask-sqlalchemy使用.html
版权: CC BY-NC-SA 4.0 知识共享署名-非商业性使用-相同方式共享4.0国际许可协议
wechat
alipay

加载评论