Flask项目(3)

这篇博客主要介绍了Flask项目中使用SQLAlchemy进行关联子查询、relathionship参数设置、join查询,以及数据库的更新、删除操作。同时深入探讨了MySQL的事务、集群、主从同步原理和读写分离对事务的影响。此外,还讲解了分库分表、分布式唯一ID生成(Snowflake算法)和SQL查询优化。在Redis部分,涵盖了Redis的事务、持久化机制、主从配置、哨兵和分布式集群,并提供了Python操作Redis事务和集群的示例。
摘要由CSDN通过智能技术生成

1.关联子查询-primaryjoin

  • 目标:可以直接使用primaryjoin指明关联条件

  • 文件: d01_primaryjoin.py

  • 除了可以使用ForeignKey的方式之外,还可以直接使用primaryjoin

  • 使用方式:

    # primaryjoin='用户表.id==foreign(关系表.user_id)'
    followings = db.relationship('Relation', 
    		primaryjoin='User.id==foreign(Relation.user_id)')
    
  • 小结

    1.使用primaryjoin,代码看起来更加直观,所以建议使用primaryjoin
    2.在sqlalchemy设置的外键属性跟数据库表中的外键没有任何关系。
    

2.relathionship其他参数说明

  • 上面获取关系列表的数据,是包含所有的,应该需要加上过滤条件relation=1

  • 文件: d02_relathionship_param.py

  • 获取关注列表:

    select user_id, target_user_id from user_relation where user_id=1 and relation=1;
    
  • lazy=‘dynamic’ 惰性查询,返回一个query对象,可以进一步过滤

    followings = db.relationship('Relation',
                                     foreign_keys='Relation.user_id',
                                     lazy='dynamic')
    user.followings.filter_by(relation=Relation.RELATION.FOLLOW).all()
    
  • uselist: 是否返回对象列表, True(默认) 返回对象列表 False返回第一个对象

  • 获取用户的资料表数据,1对1的关系,所以此时适合使用uselist=False, 返回一个对象即可

    user_profile = db.relationship('UserProfile',
                                  primaryjoin='User.id==foreign(UserProfile.id)',
                                  uselist=False)
    user = User.query.get(5)
    print(user.profile.gender)
    

3.join查询的使用

  • 目标: 可以在sqlalchemy中使用关联查询inner join

  • 文件: d03_inner_join.py

  • 使用子查询,会生成多条sql语句进行查询,效率低下。

  • 所以我们要使用inner join提高查询效率。

  • 需求:

    获取用户1的所有关注列表,指定返回的字段。
    relation_id, user_id, target_user_id, target_user_name
    
  • sql

    select r.relation_id,
    			 r.user_id, 
    			 r.target_user_id, 
    			 u.user_name as target_user_name
    			 from user_relation as r inner join user_basic as u 
    			 on r.target_user_id = u.user_id 
    			 where r.user_id=1 and r.relation=1;
    
  • sqlalchemy中子查询的做法

    # Relation类加一个relation属性target_user:
    target_user = db.relationship(
    					'User',
               primaryjoin='User.id==foreign(Relation.target_user_id)',
               uselist=False)
    
    # 查询(发生子查询,打开SQLALCHEMY_ECHO = True看sql语句)
    from sqlalchemy.orm import load_only
    relations = Relation.query.filter(
            Relation.user_id == 1,
            Relation.relation == 1,
        ).options(load_only(
            Relation.id,
            Re
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值