1、配置默认引擎

在创建数据库时如果不设置数据库类型,会默认生成MyISAM类型的数据库,但是这是不支持建立外键的。
此时需要修改配置文件(改为InnoDB)
步骤:
一、打开phpstudy选择设置页面,点击MySQL文件夹,并选择相对应的数据库
image.png
二、在MySQL文件夹中找到my.ini文件
image.png
三、打开my.ini文件夹,编辑default-storage-engine=MyISAM这条字段将MyISAM修改为所需的数据库类型
image.png
注意:这里不区分大小写,只要字母对上即可(不过写的严谨点没错)
四、重启数据库,不然还是没有效果
image.png

2、建立外键

建立class表存放班级以及其对应的id,建立student表存放学生姓名以及其对应的班级信息,其中class表中的班级与student表中的班级字段有相对应的关系,因此可以将student表中的班级字段作为外键
成功建立外键后,对应字段的左上角会出现相应的符号

  1. from sqlalchemy import create_engine, ForeignKey
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy.orm import sessionmaker
  4. from sqlalchemy import Column, String, Integer, Enum
  5. USERNAME = "root"
  6. PASSWORD = "147258"
  7. PORT = 3306
  8. HOSTNAME = "127.0.0.1"
  9. DATABASE = "primary"
  10. SLDG = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
  11. engine = create_engine(SLDG)
  12. Base = declarative_base(engine)
  13. class Class(Base):
  14. __tablename__ = "class"
  15. id = Column(Integer, primary_key=True, autoincrement=True)
  16. Class = Column("class", Enum("一班", "二班", "三班", "四班"))
  17. class Student(Base):
  18. __tablename__ = "student"
  19. id = Column(Integer, primary_key=True, autoincrement=True)
  20. name = Column(String(10))
  21. # 添加外键
  22. Class = Column("class", Integer, ForeignKey("class.id"))
  23. Base.metadata.drop_all()
  24. Base.metadata.create_all()
  25. session = sessionmaker(bind=engine)()
  26. session.commit()

代码解读:
导入ForeignKey方法,用以标记外键建立的对象

  1. from sqlalchemy import ForeignKey

书写范式:(与定义一般的字段有所不同)

  1. uid = Column('与所需建立外键联系的字段类型相同', ForeignKey("被关联表模型.字段"))

3、外键约束

是对被关联表进行的操作对关联表的影响(外键所在表),关联表的操作对被关联表没有影响
设置ForeignKey方法中的ondelete属性

  1. uid = Column('与所需建立外键联系的字段类型相同', ForeignKey("模型.字段", ondelete="CASCADE"))
  • RESTRICT:父表数据被删除,会阻止删除。默认就是这一项,无法添加额外的数据。
  • NO ACTION:在MySQL中,同RESTRICT。
  • CASCADE:级联删除。
  • SET NULL:父表数据被删除,子表数据会设置为NULL。

如果建立了外键,则默认存在RESTRICT这一外键约束,则不能在外键添加与其建立了外键关系的表中对应字段没有的内容
1、RESTRICT:
班级表
image.png
学生表
image.png
只能在规定的内容中进行选择,而不可以自己新增加或者删除内容
image.png
2、NO ACTION,对被关联表表进行相关的操作后,对关联表没有影响
3、CASCADE:级联删除(一般不使用这种类型)
所谓的级联删除,就是如果我在被关联表中删除了一条数据,关联表中与其对应的数据也会进行删除
设置代码:在生成主键的代码语句中修改ondelete属性

  1. Class = Column("class", Integer, ForeignKey("class.id", ondelete="CASCADE"))

操作前的关联表:
image.png
进行操作:
image.png
操作后的关联表:
image.png
与其相关的数据直接被删除

4、SET NULL:父表数据被删除,子表数据会设置为NULL(经常使用)
当被关联表中数据被删除后,关联表中的外键字段对应内容变成Null

  1. Class = Column("class", Integer, ForeignKey("class.id", ondelete="SET NULL"))

操作前的关联表:
image.png
进行操作:
image.png
操作后的关联表:
**image.png
外键所在字段变成了NULL,数据没有被删除
提醒一点:
在重设外键约束时,需要重新建表
(相关的orm操作就不进行了,session.delete(查询出的数据))