Follower me on GitHub

 本文主要说删除

metadata.drop_all(engine) #删除某引擎的全部表

metadata.remove(test_table)  #删除某一个table

clear_mappers() #取消所有的映射

在relation中有一个参数cascade,它是基于session的操作,包括把对象放入session,从session删除对象等,如果指定cascade=”all”表示做的任何session操作给映射类都能很好的工作,默认包含save-update, merge mapper(ParentClass, parent, properties=dict( children=relation(ChildClass, backref=’parent’, cascade=’all,delete-orphan’) )) #delete-orphan表示如果曾经是子类(childclass)实例但是却没有和父类连接的情况下,假如要删除这个子类,而不想挂空父类引用了的实例, 额看个例子就懂了: photo = Table( … ‘photo’, metadata, … Column(‘id’, Integer, primary_key=True)) tag = Table( … ‘tag’, metadata, … Column(‘id’, Integer, primary_key=True), … Column(‘photo_id’, None, ForeignKey(‘photo.id’)), … Column(‘tag’, String(80))) class Photo(object): … pass … class Tag(object): … def __init__(self, tag): … self.tag = tag … mapper(Photo, photo, properties=dict( … tags=relation(Tag, backref=’photo’, cascade=”all”))) <Mapper at 0x851504c; Photo> >>> mapper(Tag, tag) <Mapper at 0x8515dac; Tag> >>> p1 = Photo() >>> p2 = Photo() >>> p1.tags = [Tag(tag=’foo’),Tag(tag=’bar’),Tag(tag=’baz’)] >>> p2.tags = [Tag(tag=’foo’),Tag(tag=’bar’),Tag(tag=’baz’)] >>> session.add(p1) >>> session.add(p2) >>> session.flush() >>> for t in session.query(Tag): … print t.id,t.photo_id, t.tag … 1 1 foo #出现以下关联数据 2 1 bar 3 1 baz 4 2 foo 5 2 bar 6 2 baz >>> session.delete(session.query(Photo).get(1)) #删除一个tag的数据 >>> session.flush() >>> for t in session.query(Tag): … print t.id, t.photo_id, t.tag … 4 2 foo #他会删除关联所有t.photo_id为1的数据,在这里relation(ChildClass, backref=’parent’, cascade=’all,delete-orphan’)指定delete-orphan没什么,关键看下面 5 2 bar 6 2 baz >>> p3 = session.query(Photo).get(2) >>> del p3.tags[0] #如果我只是删除关联点… >>> session.flush() >>> for t in session.query(Tag): … print t.id, t.photo_id, t.tag … 4 None foo #关联点photo_id成了none,但是条目存在 –他不会影响其它关联表 5 2 bar 6 2 baz

>>> p3 = session.query(Photo).get(2) #假如没有设置delete-orphan >>> del p3.tags[0] >>> session.flush() >>> for t in session.query(Tag): … print t.id, t.photo_id, t.tag 5 2 bar #自动删除了关联的其它表的项 6 2 baz 注:可用的cascade参数包含:

  • save-update -我的理解是调用session.add()会自动将项目添加到相应级联关系上,也适用于已经从关系中删除的项目嗨没有来得及刷新的情况
  • merge - 它是session.merge的实现,复制状态到具有相同标识符的持久化实例的实例,如果没有持久的实例和当前session相关联,返回的持久化实例。如果给定的实例未保存,他会保存一个副本,并返回这个副本作为一个新的持久化实例
  • expunge - 从session中删除实例
  • delete - 标记一个实例被删除,执行flush()会执行删除操作
  • delete-orphan-如果子类从母类删除,标记之,但是不影响母类
  • refresh-expire - 定期刷新在给定的实例的属性,查询并刷新数据库
  • all - 以上全部属性的集合:“save-update,merge, refresh-expire, expunge, delete