数据库实体间有3种关联关系:一对一、一对多、多对多。
每个人只有一个身份证号码,构成一对一关系;一个公司有多个部门,构成一对多关系;公司和供货商构成多对多关系,一个公司可以选择多个供货商,供货商也能选择多个公司。
一对一关系的体现,就是最终查询到的结果是唯一的,输入一个身份证号就对应一个人。
下面用实例说明。
新建app.py,内容如下:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
from datetime import datetime
app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(50), nullable=False)
password = db.Column(db.String(50), nullable=False)
phone = db.Column(db.String(11), nullable=False)
email = db.Column(db.String(30), nullable=False)
reg_time = db.Column(db.DateTime, default=datetime.now)
class Lib_card(db.Model):
__tablename__ = 'lib_card'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
card_id = db.Column(db.Integer, nullable=False)
papers_type = db.Column(db.String(50), nullable=False)
borrow_reg_time = db.Column(db.DateTime, default=datetime.now)
user_id = db.Column(db.Integer, db.ForeignKey("user.id"))
users = db.relationship("User", backref=db.backref("cards"), uselist=False)
db.create_all()
#添加数据的路由
@app.route('/add')
def add():
user1 = User(username="张三",password="111111",phone="13888888888",email="10086@qq.com")
user2 = User(username="李四",password="123456",phone="13777777777",email="10000@qq.com")
db.session.add(user1)
db.session.add(user2)
card1 = Lib_card(card_id="18001",user_id="1",papers_type="身份证")
card2 = Lib_card(card_id="18002",user_id="2",papers_type="身份证")
db.session.add(card1)
db.session.add(card2)
db.session.commit()
return "添加数据成功!"
@app.route('/')
def index():
return "Hello!"
@app.route('/select')
def select():
user = User.query.filter(User.username=="张三").first()
print("--------------------------")
print(user)
print("--------------------------")
art = user.cards
print("--------------------------")
print(art)
print("--------------------------")
for k in art:
print(k)
print(k.card_id)
print("--------------------------")
card = Lib_card.query.filter(Lib_card.card_id=="18001").first()
user = card.users
print("--------------------------")
print(user.username)
return "查询数据成功!"
if __name__ == '__main__':
app.run(debug=True)
上面的代码中定义了两个类User和Lib_card,在Lib_card类中,user_id = db.Column(db.Integer, db.ForeignKey("user.id"))表示创建一个外键,并通过db.ForeignKey("user.id")与主表绑定。
users = db.relationship("User", backref=db.backref("cards"), uselist=False)表示user可以根据Lib_card中的card_id查找到用户表中的信息,db.backref("cards")表示用户表能直接通过cards查找到该用户下的借书证号码。
运行后查看结果,MySQL中已经生成了2个表:
打开浏览器输入http://127.0.0.1:5000/add,执行添加数据操作:
此时MySQL中也更新了数据:
再输入http://127.0.0.1:5000/select,执行查询数据操作:
从结果可以看出,两个表实现了互相查询。当通过类User确定姓名时,“cards”指代与之对应的借书证信息,user.cards由于没有使用uselist=False禁用列表,故生成的是一个列表,需要遍历才能获取信息。
而在Lib_card类中,uselist=False禁用了列表,所以能直接查找信息。这里的“users”和“cards”都变成了属性。
用Flask-SQLAlchemy创建关系表是比较重要的内容,理解起来并不容易。特别是users = db.relationship("User", backref=db.backref("cards"), uselist=False)这一指令,users和cards互相依存,均为属性。
下一次我们将增加难度,说一说如何创建一对多关系表。如果这一节理解透彻,下一次也不会太难。
你确定不关注我一波?