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()