【flask】05-不设外键的关联查询

学到了flask-SQLAlchemy, 一对多和多对多的模型,都需要建立外键,来关联表,但我们知道的,在数据库操作中,如果有外键完整性约束,会带来很多不利的影响,
比如:外键会导致表与表之间耦合,update与delete操作都会涉及相关联的表,十分影响sql 的性能,甚至会造成死锁。高并发情况下容易造成数据库性能,大数据高并发业务场景数据库使用以性能优先
所以,出于对flask-SQLAlchemy实用性的一些担忧吧(小白一个,用词不当,别介意~~),想着是否可以不添加外键,进行关联查询。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import and_

app = Flask(__name__)
# 配置数据库
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://root:mysql@127.0.0.1:3306/flask_sql"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)


# 创建roles表
class Role(db.Model):
    """roles表"""
    __tablename__ = 'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(40), unique=True)

    def __repr__(self):
        return 'Role: %d %s' % (self.id, self.name)


# 创建users表
class User(db.Model):
    """users表"""
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(40))

    def __repr__(self):
        return 'User: %d %s' % (self.id, self.name)


@app.route('/')
def index():
    return 'index'

if __name__ == '__main__':
	# 创建表
    db.drop_all()
    db.create_all()
    # 添加数据
    r1 = Role(name='role1')
    r2 = Role(name='role2')
    db.session.add_all([r1, r2])
    db.session.commit()

    u1 = User(name='user1')
    u2 = User(name='user2')
    db.session.add_all([u1, u2])
    db.session.commit()

    # 连表查询
    ret = db.session.query(Role, User).join(User, and_(Role.id == User.id, User.id == 2))
    print(ret) # 输出sql语句
    print(ret.all()) # 输出结果
    app.run(debug=True)

运行结果:

SELECT roles.id AS roles_id, roles.name AS roles_name, users.id AS users_id, users.name AS users_name 
	FROM roles INNER JOIN users ON roles.id = users.id AND users.id = %s

根据sql语句,可以看到实现了 INNER JOIN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值