flask-sqlalchemy如何使用原生的sql语句然后封装?

实现一个对主机进行分组的功能,前台提交过来的数据,包含主机名称、备注信息、主机ID,flask-sqlalchemy怎么使用原生的sql语句关联表?然后封装?

阅读 6.4k
1 个回答

这变化也忒快了吧。连问题的题目都变了


这是原题目的回答,多对多关系。

这是我设置的一个博客文章与tag多对多关系的模型,希望对你有所帮助。

class TagSpaces(db.Model):
    """多对多关系表"""
    __tablename__ = 'tag_spaces'
    tag_id = db.Column(db.Integer, db.ForeignKey('tags.id'), primary_key=True)
    article_id = db.Column(db.Integer, db.ForeignKey('articles.id'), primary_key=True)
    timestamp = db.Column(db.DateTime, default=datetime.utcnow)
class Tag(db.Model):
    """tag表"""
    __tablename__ = 'tags'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)
    tagged = db.relationship('TagSpaces',
                             foreign_keys=[TagSpaces.tag_id],
                             backref=db.backref('tagged', lazy='joined'),
                             lazy='dynamic',
                             cascade='all, delete-orphan')

    def __repr__(self):
        return '<Name %r>' % self.name
class Article(db.Model):
    """article 表"""
    __tablename__ = 'articles'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(64), index=True)
    body = db.Column(db.Text)
    
    ......
    ......    
    ......
    
    tags = db.relationship('TagSpaces',
                           foreign_keys=[TagSpaces.article_id],
                           backref=db.backref('tags', lazy='joined'),
                           lazy='dynamic',
                           cascade='all, delete-orphan')

    def tag(self, tag):
    """写文章的时候,直接往TagSpaces关联表里添加需要关联的 tag 标签"""
        if not self.is_tagging(tag):
            t = TagSpaces(tags=self, tagged=tag)
            db.session.add(t)

    def untag(self, tag):
    """从TagSpaces关联表里删除相关标签"""
        f = self.tags.filter_by(tag_id=tag.id).first()
        if f:
            db.session.delete(f)

    def is_tagging(self, tag):
    """判断相关标签是否与文章进行了关联"""
        return self.tags.filter_by(tag_id=tag.id).first() is not None
    
    @property
    def taggeds(self):
    """以article类属性的形式,返回文章的tag标签实例"""
        return Tag.query.join(TagSpaces, TagSpaces.tag_id == Tag.id).filter(TagSpaces.article_id == self.id)
    
article = Article.query.get(1) # 查询一篇文章,返回一个实例对象
print article.taggeds # 返回该篇文章关联的所有 tag 标签的实例对象。
for tag in article.taggeds:
    print tag.name
    # 循环返回所有的标签的名称

或者,你可以看看我的博客项目 —— https://github.com/eastossifrage/pyblog/blob/master/app/models.py

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题