Flask-SQLAlchemy - 不使用外键连表查询。记得常回来看我

前言

        相比于 Django 的 ORM ,SQLAlchemy "不依靠外键进行跨表联查" 的解决方案就比较多。

        没啥好说的,只能怪自己学艺不精..  _(:з」∠)_ 

解决办法

query = database.session().query(models.A, models.B)
query = query.join(models.B, models.B.UUID == models.A.UUID).filter(models.a.UUID == '2018061520180621').filter(models.b.xx= 'haha')
# 第二个filter可以继续过滤、join 或者删掉..
data = query.all() >>> print ( type(data) ) <class 'sqlalchemy.util._collections.result'> # 然而: # 列表中的项并不是标准的 Python tuple,<class 'sqlalchemy.util._collections.result'>,它是一个 AbstractKeyedTuple 对象,拥有一个 keys() 方法, # 这样可以很容易将其转换成 dict : list = [dict(zip(result.keys(), result)) for result in data] print(jsonify(list))

# 还可以在 filter 得到结果后继续加 join 进行多表联查

 按用户名摸糊查询

trans_details.query.join( models.B, models.A.user_id==models.B.id ).filter(Users.username.like('%xx%')) 
#select xxx from trans_details inner join trans_details on users.id=trans_details.user_id where users.username like '%xx%'

左外联接(left join),没有内容显示为null

trans_details.query.outerjoin(User).filter(Users.username.like('%xx%'))
#select xxx from trans_details left outer join trans_details on users.id=trans_details.user_id where users.username like '%xx%'

 

 

 

 

 

神秘代码

from flask import jsonify

-- article_view.py
@api.route('/get')
def get_article():
    dic = {"data": []}
    # 单表查询
    # data = db.session.query(models.TbArticle).all()
    # data = db.session.query(models.TbArticle, models.TbArticleContent)
    # data.join(models.TbArticle, models.TbArticle.uuid == models.TbArticleContent.uuid)

    # 另一种诡异的写法,没试过
    # results = (
    #     db.session.query(
    #         Topic.content.label('topic_content'), Reply.content.label('reply_content')
    #         )
    #     ).select_from(Topic, Reply).filter(Topic.id == Reply.topic_id).paginate(page, per_page)

    # 上文的写法
    query = db.session().query(models.TbArticle, models.TbArticleContent)
    query = query.join(

        # 取出所有
        models.TbArticleContent, models.TbArticleContent.uuid == models.TbArticle.uuid)

        # 过滤出 TbArticle.uuid : [tuple]
        # .filter(models.TbArticle.uuid == '0553857835404640804')

        # 自定义显示字段:[]
        # .with_entities(
        #     models.TbArticle.uuid, models.TbArticle.title, models.TbArticleContent.content
        # )

    data = query.all()

    data_list 数据结构:[{"TbArticle": <TbArticle 2312>, "TbArticleContent": <TbArticleContent 0553857835404640804>},{}]
    data_list = [dict(zip(result.keys(), result)) for result in data]

    dic["data"].extend(data_list)
    print(data_list)

    # 取出字典中的对象:
    # for i in data_list:
    #     print(i["TbArticle"].create_time)
    #     print(i["TbArticleContent"].Content)

    # for obj in data:
    #     # dic["data"].append({"uuid": obj.uuid, "title": obj.title})
    #     print(type(obj))
    # return jsonify(dic)

    return jsonify("ok")

查询出的结果/对象:
# from sqlalchemy.util._collections import result
View Code

 

博客搬运地址

  1. Flask-SQLAlchemy 操作 - 连表查询 - 筛选字段
  2. flask sqlalchemy非外键连接两个表
  3. Python sqlalchemy 多表查询 没有外键
  4. sqlalchemy多表联合查询
  5. 在 Flask-SQLAlchemy 中联表查询 - (目测是真正的大佬)

 

转载于:https://www.cnblogs.com/clement-jiao/p/10010497.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 Flask-SQLAlchemy 创建中间表类时,建议采用以下命名规则: 1. 表名:采用复数形式,表示这是一个多对多的关系表。例如,如果你有两个类 `User` 和 `Role`,则它们之间的关系可以用一个中间表来表示,该中间表的表名应该为 `users_roles`。 2. 类名:采用单数形式,表示这是一个中间表类。例如,如果你有一个中间表 `users_roles`,则对应的类名应该为 `UserRole`。 3. 属性名:一般采用外键表名+外键字段名的形式。例如,如果你的中间表 `users_roles` 包含外键 `user_id` 和 `role_id`,则对应的属性名应该为 `user_id` 和 `role_id`。 综上所述,你可以按照上述规则来命名你的中间表类,例如: ```python from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) roles = db.relationship('Role', secondary='users_roles', backref=db.backref('users', lazy='dynamic')) class Role(db.Model): __tablename__ = 'roles' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64)) class UserRole(db.Model): __tablename__ = 'users_roles' user_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True) role_id = db.Column(db.Integer, db.ForeignKey('roles.id'), primary_key=True) ``` 注意,这里的中间表类 `UserRole` 中包含了两个外键属性 `user_id` 和 `role_id`,分别对应于 `users_roles` 表中的外键 `user_id` 和 `role_id`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值