码迷,mamicode.com
首页 > 数据库 > 详细

SQLAlchemy中表结构的一对多

时间:2018-11-03 12:28:58      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:对象   .data   取值   ssi   列表   __init__   mode   world   string   

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()

app = Flask(__name__)
# 连接数据库
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:123456@localhost:3306/flask"
# 采用自动提交方式
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True
db = SQLAlchemy(app)


class LOL(db.Model):
    # 创建表名为
    __tablename__ = "lol"
    # 创建字段
    id = db.Column(db.Integer, primary_key=True)
    lname = db.Column(db.String(30), nullable=False)
    # 增加关联属性以及反向引用属性
    # 这里一对一是uselist = False,这里的是lazy
    data = db.relationship("DOTA2", backref="lol", lazy="dynamic")

    def __init__(self, lname):
        self.lname = lname

    def __repr__(self):
        return "<LOL:%r>" % self.lname


class DOTA2(db.Model):
    __tablename__ = "dota2"
    id = db.Column(db.Integer, primary_key=True)
    dname = db.Column(db.String(30))
    # 增加一个列(外键):表示引用自LOL表的外键
    lol_id = db.Column(db.Integer, db.ForeignKey("lol.id"))

    def __init__(self, dname):
        self.dname = dname

    def __repr__(self):
        return "<DOTA2:%r>" % self.dname


db.create_all()

@app.route(/)
def hello_world():
    return Hello World!


@app.route(/lol)
def lol_view():
    loldata = LOL("三只手")
    db.session.add(loldata)
    print(db.session.query(LOL).all())
    return "OK"


@app.route("/dota2")
def dota2_view():
    dota2data = DOTA2("电棍")
    lol = db.session.query(LOL).filter(LOL.id==3).first()
    dota2data.lol_id = lol.id
    db.session.add(dota2data)
    print(db.session.query(DOTA2).all())
    return "OK"


@app.route(/query)
def query_view():
    # 正向关联查找,由于是一对多,因此查询到要查找的“一”,然后在利用正向关联,获取到dota2表中的“多”
    # 返回一个对象
    lol = LOL.query.filter_by(id=2).first()
    print(lol)
    dotas = lol.data.all()
    for dota in dotas:
        print("lol:%s,dota2:%s" % (lol.lname, dota.dname))

    # 反向关联查找,利用外键字段的一个值,将所有符合的英雄取出来,由于是把所有对象放在一个列表,因此进行循环遍历
    # dota2s = DOTA2.query.filter_by(lol_id=2).all()
    # for dota2 in dota2s:
    #     # 利用对象调用反向关联属性,得到lol表中关联对象,因此再取值
    #     data = dota2.lol
    #     print("lol:%s,dota2:%s" % (data.lname, dota2.dname))
    return "OK"

if __name__ == __main__:
    app.run(debug=True)

输出结果:

lol:EZ,dota2:小黑
lol:EZ,dota2:风行者

 

SQLAlchemy中表结构的一对多

标签:对象   .data   取值   ssi   列表   __init__   mode   world   string   

原文地址:https://www.cnblogs.com/zengsf/p/9900144.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!