浅谈sqlalchemy层面删除及其注意事项!

sqlalchemy层面删除会无视外键约束( 推荐阅读 sqlalchemy 外键创建及四种外键约束 ),直接将数据库表中的数据删除。下面我们就举例来演示下
  
首先,我们创建两个模型(User/Arctire),代码如下(相信大家都比较熟悉sqlalchemy了,故省略了导入代码及创建模型部分代码)

#父表
class User(Base): 
  __tablename__ = "user"  
  id = Column(Integer , primary_key=True , autoincrement=True) 
  name = Column(String(50) , nullable=False)

#从表   
class Arctire(Base): 
  __tablename__ = "arctire"  
  id = Column(Integer , primary_key=True , autoincrement=True)  
  title = Column(String(50) , nullable=False)  
  uid = Column(Integer , ForeignKey("user.id"))  
  author = relationship("User" , backref="arctires")
     
       运行代码上述代码,然后打开mysql命令行工具输入以下代码(如下图所示,说明表成功创建)



       由于我们要做删除,所以表必须要有数据才行,说干就干,插入条数据瞧瞧!

user = User(name = "tom")  
arctire = Arctire(title = "hello world!")  
arctire.author = user  
session.add(user)  
session.commit()

       运行下面代码,如下所示表明数据成功插入到表中。




       插入成功,下面我们就来做删除操作。首先找到父表中的数据,将父表数据删除(代码如下),看看会发生什么!

user = session.query(User).first()
session.delete(user)
session.commit()

       从下图可以发现,父表(user)数据真的被删除了,而从表(arctire)数据依然还在,但外键uid却变为NULL了。



要想避免上述现象,只需将从表中外键字段的nullable设为False即可。这样,就会拒绝删除父表数据。


原文出自汤利军博客,转载请保留链接: http://tlj.jxkos.com/server/python/73.html

猜你喜欢

转载自blog.csdn.net/aimill/article/details/80677263