前面讲了那么多关于sqlalchemy相关知识,今天就为大家讲讲sqlalchemy外键创建及其四种外键约束。
#因为外键涉及到两张表,所以建了user跟arctire两张表
from sqlalchemy import create_engine,Column,Integer,String,Text,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.session import sessionmaker
DIALCT = "mysql"
DRIVER = "pymysql"
USERNAME = "root"
PASSWORD = "root"
HOST = "127.0.0.1"
PORT = "3306"
DATABASE = "test"
DB_URI = {}+{}://{}:{}@{}:{}/{}?charset=utf8.format(DIALCT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)
engine = create_engine(DB_URI)
Base = declarative_base(engine)
sesion = sessionmaker(engine)()
#因为外键涉及到两张表,所以建了user跟arctire两张表
class User(Base):
__tablename__ = "user"
id = Column(Integer , primary_key=True , nullable=False)
name = Column(String(10) , nullable=False)
def __repr__(self):
return "<User name:%s>"%self.name
class Arctire(Base):
__tablename__ = "arctire"
id = Column(Integer , primary_key=True , nullable=False)
title = Column(String(50) , nullable=False)
content = Column(Text , nullable=False)
# 创建uid字段(Integer:该字段类型要跟父表被继承字段类型保持一致,ForeignKey:其中user表示arctire要引用的表,id表示要引用的字段)
# 创建uid字段(Integer:该字段类型要跟父表被继承字段类型保持一致,ForeignKey:其中user表示arctire要引用的表,id表示要引用的字段)
uid = Column(Integer , ForeignKey("user.id"))
#Base.metadata.drop_all()
#Base.metadata.create_all()
我们使用mysql 命令行工具查看数据库表及外键是否创建成功
如果出现下图,说明数据库表创建成功
如果出现 “CONSTRAINT”,说明外键创建成功(注意:只有当数据库引擎设置为InnoDB时,才能成功创建外键)
外键创建成功后,我们就可以向user、arctire数据表中插入两条数据(不知道用sqlalchemy操作mysql数据库表的同学,可以参考我上篇文章 “使用sqlalchemy对数据库表进行增删查改操作”),来测试外键的四种关系。
我们使用mysql 命令行工具查看数据库表及外键是否创建成功
如果出现下图,说明数据库表创建成功
如果出现 “CONSTRAINT”,说明外键创建成功(注意:只有当数据库引擎设置为InnoDB时,才能成功创建外键)
外键创建成功后,我们就可以向user、arctire数据表中插入两条数据(不知道用sqlalchemy操作mysql数据库表的同学,可以参考我上篇文章 “使用sqlalchemy对数据库表进行增删查改操作”),来测试外键的四种关系。
user = User(name = "blue")
sesion.add(user)
sesion.commit()
arctire = Arctire(title = "first title" , content="first title first title" , uid=1)
sesion.add(arctire)
sesion.commit()
添加数据后,我们可以查看数据是否插入成功
外键四种关系:删除表(RESTRICT / NO ACTION / CASCADE / SET NULL)
第一种:RESTRICT(默认就是这种。当父表数据被删除,从表会拒绝删除)
语法:uid = Column(Integer , ForeignKey("user.id" ,ondelete="RESTRICT"))
第二种:NO ACTIION(同RESTRICT 一样)
语法: uid = Column(Integer , ForeignKey("user.id" ,ondelete="NO ACTION"))
第三种:CASCADE (父表数据删除、从表数据也会跟着删除)
语法:uid = Column(Integer , ForeignKey("user.id" ,ondelete="CASCADE"))
第四种: SET NULL (父表数据删除,从表外键字段设为NULL)
语法:uid = Column(Integer , ForeignKey("user.id" ,ondelete="SET NULL"))
注意: 如果uid字段设置了 nullable=False , 再设置 ondelete = "SET NULL",pycharm运行程序则会报错
添加数据后,我们可以查看数据是否插入成功
外键四种关系:删除表(RESTRICT / NO ACTION / CASCADE / SET NULL)
第一种:RESTRICT(默认就是这种。当父表数据被删除,从表会拒绝删除)
语法:uid = Column(Integer , ForeignKey("user.id" ,ondelete="RESTRICT"))
第二种:NO ACTIION(同RESTRICT 一样)
语法: uid = Column(Integer , ForeignKey("user.id" ,ondelete="NO ACTION"))
第三种:CASCADE (父表数据删除、从表数据也会跟着删除)
语法:uid = Column(Integer , ForeignKey("user.id" ,ondelete="CASCADE"))
第四种: SET NULL (父表数据删除,从表外键字段设为NULL)
语法:uid = Column(Integer , ForeignKey("user.id" ,ondelete="SET NULL"))
注意: 如果uid字段设置了 nullable=False , 再设置 ondelete = "SET NULL",pycharm运行程序则会报错