- from flask import Flask
- from flask_sqlalchemy import SQLAlchemy
- App = Flask(__name__)
- # 数据库的连接配置
- App.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:[email protected]: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)
来源: http://www.bubuko.com/infodetail-3098938.html