【flask學習】05-不設外來鍵的關聯查詢
阿新 • • 發佈:2018-12-15
學到了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:[email protected]: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