一、反向引用
反向引用:
In [1]: from Flask_SQLalchemy_demo import *
添加一个角色和两个用户
In [2]: role = Role(name = 'admin')
In [3]: db.session.add(role)
In [4]: db.session.commit()
In [5]: user1 = User(name='zs', role_id = role.id)
In [6]: user2 = User(name='ls', role_id = role.id)
In [7]: db.session.add_all([user1, user2])
In [8]: db.ses
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-8-52cc6e1a39e6> in <module>
----> 1 db.ses
AttributeError: 'SQLAlchemy' object has no attribute 'ses'
In [9]: db.session.commit()
实现关系引用查询:
In [10]: role.users
Out[10]: [<User: zs 1 None None>, <User: ls 2 None None>]
In [11]: user1.role
Out[11]: <Role: admin 1>
In [12]: user2.role
Out[12]: <Role: admin 1>
In [13]: user2.role.name
Out[13]: 'admin'
In [14]: user1.role.users
Out[14]: [<User: zs 1 None None>, <User: ls 2 None None>]
Flask_SQLalchemy_demo.py代码:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import create_engine
import pymysql
app = Flask(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
# 配置数据库的地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@localhost:3306/flask_sql_demo?charset=utf8mb4'
# 跟踪数据库的修改 --> 不建议开启 未来的版本中会移除
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)
'''
两张表
角色(管理员 / 普通用户)
用户(角色ID)
'''
# 数据库的模型,需要继承db.Model
class Role(db.Model):
# 定义表名
__tablename__ = 'roles'
# 定义字段
# db.Column表示是一个字段
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
# 在一的一方,写关联
# users = db.relationship('User'):表示和User模型发生了关联,增加了一个users属性
# backref = 'role': 表示role是User要用的属性
users = db.relationship('User', backref = 'role')
# repr()方法显示一个可读字符串
def __repr__(self):
return '<Role: %s %s>' % (self.name, self.id)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(16), unique=True)
email = db.Column(db.String(32), unique=True)
password = db.Column(db.String(32))
# db.ForeignKey('roles.id') 表示是外键。表名.id
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
# User希望有role属性,但是这个属性的定义,需要在另一个模型中定义
def __repr__(self):
return '<User: %s %s %s %s>' % (self.name, self.id, self.email, self.password)
@app.route('/')
def index():
return 'Hello World!'
db.drop_all()
db.create_all()
if __name__ == '__main__':
app.run()
# 删除表
# db.drop_all()
# 创建表