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

发布时间:2018-04-27 编辑:汤利军 阅读:

前面讲了那么多关于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运行程序则会报错



 

关注我

图文推荐

云标签

友链交换