flask_sqlalchemy 多表非外键查询,多表关系映射

flask_sqlalchemy 多表非外键查询,多表关系映射

工作中需要使用sql进行查询, 然而flask的多半教程还有关系都用的是外键处理。在这里分享一下关于非外键数据处理

表结构如下:

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Category(db.Model, UserMixin):  #
    id = db.Column(db.Integer, primary_key=True, comment='主键')
    name = db.Column(db.String(20), comment='关键词名')
class City(db.Model, UserMixin):  #
    id = db.Column(db.Integer, primary_key=True, comment='主键')
    name = db.Column(db.String(20), comment='关键词名')
class News(db.Model):
    id = db.Column(db.Integer, primary_key=True, comment='主键')
    title = db.Column(db.String(20), comment='标题')
    body = db.Column(db.Text, comment='内容')
    category_id = db.Column(db.Integer, default=None, comment='关键词id')
    city_id = db.Column(db.Integer, default=None, comment='城市id')


双表查询如下:

查询news表中id为1的数据
new1 = db.session.query(News,Category).join(Category,Category.id = News.id).filter(News.id ==1).first()
查询具体值:
print(new1.News.title)  #查询news表中id为1 的title
print(new1.News.title)  #查询news表中id为1 的title
print(new1.Category.name) #查询new1相关联的name


考虑一下性能,在字段很多的时候加载比较慢,而我们仅仅需要查询category表的一个字段,可以这样查询

查询news表中id为1的数据
new1 = db.session.query(News,Category.name.label("category_name")).join(Category,Category.id = News.id).filter(News.id ==1).first()
查询具体值:
print(new1.News.title)  #查询news表中id为1 的title
print(new1.News.title)  #查询news表中id为1 的title
print(new1.category_name) #查询new1相关联的name

3表多个多表查询,只需要在join后面添加就好,示例如下:

查询news表中id为1的数据
new1 = db.session.query(News,Category,City).join(Category,Category.id = News.id).join(City,News.city_id==City.id).filter(News.id ==1).first()