1. 程式人生 > 實用技巧 >03 php基礎中

03 php基礎中

  • 一對多關係

    • 多表關係中, 通過外來鍵來關聯資料
    • 一對多關係中, 外來鍵設定在 多的一方
  • 通過關係屬性來關係/查詢資料 操作簡單

    • 1> 需要定義外來鍵
    • 2> 定義關係屬性
    • 3> 使用關係屬性來關聯資料
# 使用者表  一個使用者有多個地址  一
class User(db.Model):
    __tablename__ = "users"  # 設定表名 表名預設為類名的小寫
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    # 建立關係屬性  relationship("關聯的類名", backref="對方表查詢關聯資料時的屬性名")
    addresses = db.relationship("Address", backref="user")


# 地址表   多
class Address(db.Model):
    __tablename__ = "addresses"  # 設定表名 表名預設為類名的小寫
    id = db.Column(db.Integer, primary_key=True)
    detail = db.Column(db.String(64), unique=True)
    # 設定外來鍵(一般記錄的是另一張表的主鍵)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"))


@app.route('/')
def index():
    # 刪除 所有繼承自db.Model的表
    db.drop_all()
    # 建立 所有的繼承自db.Model的表
    db.create_all()
    """只通過外來鍵來關聯/查詢資料 操作複雜"""
    # # 新增使用者
    # user = User(name="zs")
    # db.session.add(user)
    # db.session.commit()  # 必須先提交, 否則沒有生成主鍵, 設定外來鍵無效
    #
    # # 新增地址
    # adr1 = Address(detail="中關村1號", user_id=user.id)
    # adr2 = Address(detail="陸家嘴1號", user_id=user.id)
    # db.session.add_all([adr1, adr2])
    # db.session.commit()
    #
    # # 查詢資料  根據使用者查詢地址
    # adrs = Address.query.filter_by(user_id=user.id).all()
    # for adr in adrs:
    #     print(adr.detail)

    """通過關係屬性來關係/查詢資料 操作簡單  1> 仍需要定義外來鍵 2> 定義關係屬性 3> 使用關係屬性來關聯資料"""
    user = User(name="zs")
    adr1 = Address(detail="中關村1號", user_id=user.id)
    adr2 = Address(detail="陸家嘴1號", user_id=user.id)
    # 關聯資料
    # user.addresses = [adr1, adr2]
    user.addresses.append(adr1)
    user.addresses.append(adr2)
    # 新增到資料庫中
    db.session.add_all([user, adr1, adr2])
    db.session.commit()
    # 使用關係屬性來查詢資料
    print(user.addresses)
    print(adr1.user)

    return 'index'

多對多關係

  • 多對多關係中, 必須建立獨立的關係表來關聯資料
  • 多對多中, 通過關係屬性來關連/查詢資料
    • 1> 定義關係表來設定外來鍵
    • 2> 定義關係屬性 多對多關係屬性, 還需要設定引數secondary="關係表名"
    • 3> 使用關係屬性來關聯資料
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
# 設定資料庫連線地址
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:[email protected]:3306/test18"
# 是否追蹤資料庫修改  很消耗效能, 不建議使用
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# 設定在控制檯顯示底層執行的SQL語句
app.config["SQLALCHEMY_ECHO"] = False

# 建立資料庫連線
db = SQLAlchemy(app)

# 建立關係表  多對多關係必須建立單獨的表來記錄關聯資料
t_stu_cur = db.Table("table_stu_cur",
         db.Column("stu_id", db.Integer, db.ForeignKey("students.id"), primary_key=True),
         db.Column("cur_id", db.Integer, db.ForeignKey("courses.id"), primary_key=True)
         )


# 學生表  多  一個學生可以選多門課, 一門課也可以被多個學生選
class Student(db.Model):
    __tablename__ = "students"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    # 多對多關係屬性, 還需要設定引數secondary="關係表名"
    courses = db.relationship("Course", backref="students", secondary="table_stu_cur")


# 課程表   多
class Course(db.Model):
    __tablename__ = "courses"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)



@app.route('/')
def index():
    # 刪除 所有繼承自db.Model的表
    db.drop_all()
    # 建立 所有的繼承自db.Model的表
    db.create_all()
    """多對多 通過關係屬性來關連/查詢資料 操作簡單  1> 定義關係表來設定外來鍵 2> 定義關係屬性 3> 使用關係屬性來關聯資料"""
    stu1 = Student(name="zs")
    stu2 = Student(name="ls")
    cur1 = Course(name="python")
    cur2 = Course(name="c")
    cur3 = Course(name="java")
    # 關聯資料
    stu1.courses.append(cur1)
    stu1.courses.append(cur2)
    stu2.courses.append(cur2)
    stu2.courses.append(cur3)
    # 新增到資料庫
    db.session.add_all([stu1, stu2, cur1, cur2, cur3])
    db.session.commit()

    print(stu1.courses)
    print(cur2.students)
    return 'index'


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