1、配置默认引擎
在创建数据库时如果不设置数据库类型,会默认生成MyISAM类型的数据库,但是这是不支持建立外键的。
此时需要修改配置文件(改为InnoDB)
步骤:
一、打开phpstudy选择设置页面,点击MySQL文件夹,并选择相对应的数据库
二、在MySQL文件夹中找到my.ini文件
三、打开my.ini文件夹,编辑default-storage-engine=MyISAM这条字段将MyISAM修改为所需的数据库类型
注意:这里不区分大小写,只要字母对上即可(不过写的严谨点没错)
四、重启数据库,不然还是没有效果
2、建立外键
建立class表存放班级以及其对应的id,建立student表存放学生姓名以及其对应的班级信息,其中class表中的班级与student表中的班级字段有相对应的关系,因此可以将student表中的班级字段作为外键
成功建立外键后,对应字段的左上角会出现相应的符号
from sqlalchemy import create_engine, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column, String, Integer, Enum
USERNAME = "root"
PASSWORD = "147258"
PORT = 3306
HOSTNAME = "127.0.0.1"
DATABASE = "primary"
SLDG = f"mysql+mysqlconnector://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
engine = create_engine(SLDG)
Base = declarative_base(engine)
class Class(Base):
__tablename__ = "class"
id = Column(Integer, primary_key=True, autoincrement=True)
Class = Column("class", Enum("一班", "二班", "三班", "四班"))
class Student(Base):
__tablename__ = "student"
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(10))
# 添加外键
Class = Column("class", Integer, ForeignKey("class.id"))
Base.metadata.drop_all()
Base.metadata.create_all()
session = sessionmaker(bind=engine)()
session.commit()
代码解读:
导入ForeignKey方法,用以标记外键建立的对象
from sqlalchemy import ForeignKey
书写范式:(与定义一般的字段有所不同)
uid = Column('与所需建立外键联系的字段类型相同', ForeignKey("被关联表模型.字段"))
3、外键约束
是对被关联表进行的操作对关联表的影响(外键所在表),关联表的操作对被关联表没有影响
设置ForeignKey方法中的ondelete属性
uid = Column('与所需建立外键联系的字段类型相同', ForeignKey("模型.字段", ondelete="CASCADE"))
- RESTRICT:父表数据被删除,会阻止删除。默认就是这一项,无法添加额外的数据。
- NO ACTION:在MySQL中,同RESTRICT。
- CASCADE:级联删除。
- SET NULL:父表数据被删除,子表数据会设置为NULL。
如果建立了外键,则默认存在RESTRICT这一外键约束,则不能在外键添加与其建立了外键关系的表中对应字段没有的内容
1、RESTRICT:
班级表
学生表
只能在规定的内容中进行选择,而不可以自己新增加或者删除内容
2、NO ACTION,对被关联表表进行相关的操作后,对关联表没有影响
3、CASCADE:级联删除(一般不使用这种类型)
所谓的级联删除,就是如果我在被关联表中删除了一条数据,关联表中与其对应的数据也会进行删除
设置代码:在生成主键的代码语句中修改ondelete属性
Class = Column("class", Integer, ForeignKey("class.id", ondelete="CASCADE"))
操作前的关联表:
进行操作:
操作后的关联表:
与其相关的数据直接被删除
4、SET NULL:父表数据被删除,子表数据会设置为NULL(经常使用)
当被关联表中数据被删除后,关联表中的外键字段对应内容变成Null
Class = Column("class", Integer, ForeignKey("class.id", ondelete="SET NULL"))
操作前的关联表:
进行操作:
操作后的关联表:
**
外键所在字段变成了NULL,数据没有被删除
提醒一点:
在重设外键约束时,需要重新建表
(相关的orm操作就不进行了,session.delete(查询出的数据))