# 用户表 一个用户有多个地址 一
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'
多对多关系
from flask import Flask
from flask_sqlalchemy import sqlAlchemy
app = Flask(__name__)
# 设置数据库连接地址
app.config["sqlALCHEMY_DATABASE_URI"] = "MysqL://root:MysqL@127.0.0.1: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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。