arcengine遍历属性表_Flask干货:访问数据库——Flask-SQLAlchemy创建一对一关系表

f4efa9bacf58eeffd4d95249b09d11d5.png

数据库实体间有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个表:

2c4e228bcd913d0f1fb8ae901946b97c.png

打开浏览器输入http://127.0.0.1:5000/add,执行添加数据操作:

fbdd2b436acd0126553db8e3c5c42639.png

此时MySQL中也更新了数据:

425b0e83d5682ea88a914c295d35ba8b.png

7ac9af1edb9fe3e114022c172d5577c4.png

再输入http://127.0.0.1:5000/select,执行查询数据操作:

9a12f93a16c9dd9e29d4486be6a4c4e1.png

从结果可以看出,两个表实现了互相查询。当通过类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互相依存,均为属性。

下一次我们将增加难度,说一说如何创建一对多关系表。如果这一节理解透彻,下一次也不会太难。

你确定不关注我一波?

48999be157bbd169db2db0ea5a41e46c.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值