python 關係對映

Cassie1492949236626發表於2018-12-07

python中關係對映主要包括三種:一對多關係對映、一對一關係對映、多對多關係對映。

一對多關係對映
    一方:Student(學生)
        新增關聯屬性和反向引用
    多方:Article(文章)
        新增外來鍵關聯
        
一對一關係對映
    一方:Student(學生)主表
        新增多對多的關聯屬性和反向引用,同時uselist取值為FALSE,表示fetchone
        新增第三張表的關聯屬性和反向引用關係
    一方:Detail(詳情表)次表
        新增外來鍵關聯

多對多關係對映
    多方:Users
        新增多對多的關聯屬性和反向引用,同時指明第三張關聯表(2)
        新增對第三張表的關聯屬性和反向引用(2)
    多方:Goods
        新增對第三張表的關聯屬性和反向引用(2)
    第三張關聯表:UsersGoods
複製程式碼

一對多關係對映

# 一方
class Student(db.Model):
    __tablename__ = "student"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), nullable=False)
    # 增加關聯屬性和反向引用關係
    # 關聯屬性:在student物件中通過哪個屬效能夠得到對應的所有的article物件
    # 反向引用:在article物件中通過哪個屬效能夠得到它對應的student
    articles = db.relationship('Article', backref="student", lazy="dynamic")

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

    def __repr__(self):
        return "<Student:%r>" % self.name

# 多方
class Article(db.Model):
    __tablename__ = "article"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), nullable=False)
    # 增加一個列(外來鍵):引用自article表的主鍵,這一段程式碼是為了生成資料庫關聯。
    student_id = db.Column(db.Integer, db.ForeignKey('student.id')) # 這裡的student是資料庫表名

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

    def __repr__(self):
        return "<Article:%r>" % self.tname
複製程式碼

一對一關係對映

# 一方
class Student(db.Model):
    __tablename__ = "student"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30), nullable=False)
    # 增加關聯屬性和反向引用關係
    # 關聯屬性:在student物件中通過哪個屬效能夠得到detail資訊
    # 反向引用:在detail物件中通過哪個屬效能夠得到它對應的student
    # uselist is for the purpose of fetchone
    user = db.relationship('Detail', backref='student', uselist=False)

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

    def __repr__(self):
        return "<Student:%r>" % self.name

class Detail(db.Model):
    __tablename__ = 'detial'
    id = db.Column(db.Integer, primary_key=True)
    weight = db.Column(db.Float)
    student_id = db.Column(db.Integer, db.ForeignKey('student.id'))
    
複製程式碼

多對多關係對映

class Users(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(80),nullable=False,unique=True)
    age = db.Column(db.Integer)
    email = db.Column(db.String(120),unique=True)
    isActive = db.Column(db.Boolean,default=True)

    # 新增多(Users)對多(Goods)的關聯屬性和反向引用關係
    # 涉及到第三張關聯表 - users_goods
    goods=db.relationship(
        'Goods',
        secondary='users_goods',
        lazy="dynamic",
        backref=db.backref(
            "users",
            lazy='dynamic')
    )

    #增加對UsersGoods的關聯屬性和反向引用關係:目的是為了建立Users類 與 UsersGoods類 之間的關係
    userGoods = db.relationship('UsersGoods',backref="user",lazy="dynamic")


class Goods(db.Model):
    __tablename__ = "goods"
    id = db.Column(db.Integer,primary_key=True)
    gname = db.Column(db.String(80))
    gprice = db.Column(db.Float)

    #增加對UsersGoods類的關聯屬性和反向引用關係
    goodUsers = db.relationship('UsersGoods',backref="good",lazy="dynamic")

# 建立 users_goods 的第三張關聯表,從而來表示多對多的關係
class UsersGoods(db.Model):
    __tablename__ = "users_goods"
    id = db.Column(db.Integer,primary_key=True)
    users_id = db.Column(db.Integer,db.ForeignKey('users.id'))
    goods_id = db.Column(db.Integer,db.ForeignKey('goods.id'))
    count = db.Column(db.Integer,default=1)

# user.goods
# user.userGoods
# good.users
# good.goodUsers
# goodUsers.good
# userGoods.user
複製程式碼

相關文章