from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # 数据库的连接配置 app.config[‘SQLALCHEMY_DATABASE_URI‘] = ‘mysql+pymysql://root:mysql@0.0.0.0:3306/flask_0620‘ app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS‘] = False db = SQLAlchemy(app) class Role(db.Model): # 指定表名,可以不用写,默认会以当前类的类名小写作为表名 __tablename__ = "roles" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) # 指定关系,可以通过一个属性将当前一的一方查询出所对应的多的这一方的所有数据 # backref:反向引用,给user身上添加role这个属性,并且该属性指定的值就是当前用户所对应的一的这一方的数据 # users和role是自己随便起的名字
# lazy决定了什么时候SQLALchemy从数据库中加载数据
# 1.如果设置为子查询方式(subquery),则会在加载完User对象后, # 就立即加载与其关联的对象,这样会让总查询数量减少,但如果返回的条目数量很多,就会比较慢
# 2.另外,也可以设置为动态方式(dynamic),这样关联对象会在被使用的时候再进行加载, # 并且在返回前进行过滤,如果返回的对象数很多,或者未来会变得很多,那最好采用这种方式
users = db.relationship(‘User‘, backref=‘role‘,lazy=‘dynamic‘) # 查询指定role对象下所有的用户 # print(ro2.users) # 取到user1所对应的角色的对象 # print(user1.role) def __repr__(self): return "<Role %s>" % self.name class User(db.Model): __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) # 添加外键,指定该外键关系哪张表的哪一列 role_id = db.Column(db.Integer, db.ForeignKey(‘roles.id‘)) def __repr__(self): return "<User %s>" % self.name @app.route(‘/‘) def index(): return ‘hello world‘ if __name__ == ‘__main__‘: db.drop_all() db.create_all() # 初始化一个模型 ro1 = Role(name=‘admin‘) # 将模型 add到db.session中 db.session.add(ro1) # 提交一下当前的事务 db.session.commit() ro2 = Role(name=‘user‘) db.session.add(ro2) db.session.commit() user1 = User(name=‘laowang‘) user1.role_id = ro1.id user2 = User(name=‘laoli‘) user2.role_id = ro2.id user3 = User(name=‘laoz‘) user3.role_id = ro2.id db.session.add_all([user1, user2, user3]) db.session.commit() # 修改数据 user1.name = ‘laopan‘ db.session.commit() # 断开数据库的连接不然下一次会报错 db.session.remove() app.run(debug=True)
原文:https://www.cnblogs.com/songyanxin/p/11062297.html