数据库事务四大特性ACID:
- 原子性(Atomicity)
- 一致性(Consistency)
- 隔离性(Isolation)
- 持久性(Durability)
基于原子性对存在重复数据的表进行拆分
一对多:
# 用户表 一
class User(db.Model):
__tablename__ = "t_user"
id = db.Column(db.Integer, primary_key=True) # 主键在数据添加到数据库后会自动生成
name = db.Column(db.String(40), unique=True)
# 定义关系属性 relationship("关联类名", backref="反向取值时的属性名")
addresses = db.relationship("Address", backref="user_info") # backref="xx" 等价于 反向关系属性
# 地址表 多
class Address(db.Model):
__tablename__ = "t_address"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(40), unique=True)
user_id = db.Column(db.Integer, db.ForeignKey("t_user.id")) # 定义外键 必须在多的一方
# user_info = db.relationship("User")
@app.route('/')
def index():
""" 只使用外键来关联数据 1> 定义外键 2> 使用外键来关联/查询数据 """
# user1 = User(name="zs")
# db.session.add(user1)
# db.session.commit() # 必须先提交一, 否则不会生成主键, 外键设置会失败
# adr1 = Address(name="中关村1号", user_id=user1.id)
# adr2 = Address(name="华强北1号", user_id=user1.id)
# db.session.add_all([adr1, adr2])
# db.session.commit()
# 查询zs的地址
# user_zs = User.query.filter_by(name="zs").first()
# adrs = Address.query.filter_by(user_id=user_zs.id).all()
# for adr in adrs:
# print(adr.name)
""" 使用关系属性来关联数据 1> 定义外键 2> 定义关系属性 3> 使用关系属性来关联和查询数据"""
user1 = User(name="zs")
adr1 = Address(name="中关村1号")
adr2 = Address(name="华强北1号")
# 使用关系属性来关联数据
db.session.add_all([adr1, adr2, user1])
db.session.commit()
# 查询zs的地址
# user_zs = User.query.filter_by(name="zs").first()
# adrs = user_zs.addresses
# for adr in adrs:
# print(adr.name)
return "index"
多对多:
# 定义关系表
class StudentCourse(db.Model):
__tablename__ = "stu_cou"
stu_id = db.Column(db.Integer, db.ForeignKey("student.id"), primary_key=True)
cur_id = db.Column(db.Integer, db.ForeignKey("course.id"), primary_key=True)
# 学生表 多
class Student(db.Model):
__tablename__ = "student"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(40), unique=True)
# 多对多关系属性需要设置secondary参数 secondary="关系表的表名"
courses = db.relationship("Course", backref="students", secondary="stu_cou")
# 课程表 多
class Course(db.Model):
__tablename__ = "course"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(40), unique=True)
@app.route('/')
def index():
""" 使用关系属性来关联数据 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.extend([cur2, cur3])
db.session.add_all([stu2, stu1,cur3,cur2, cur1])
db.session.commit()
# 查询关联数据
curs = stu1.courses
for cur in curs:
print(cur.name)
# stus = cur2.students
# for stu in stus:
# print(stu.name)
return "index"