sqlalchemy 外键创建及四种外键约束

       前面讲了那么多关于sqlalchemy相关知识,今天就为大家讲讲sqlalchemy外键创建及其四种外键约束。
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 = Column(Integer , ForeignKey("user.id"))

#Base.metadata.drop_all()
#Base.metadata.create_all()

我们使用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运行程序则会报错

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值