4

多対多の関係で削除するオブジェクトを取得しないようにする方法はありますか?

assign = Table('manytomany', Base.metadata,
    Column('pid', String(...), ForeignKey('parent.pid')),
    Column('cid', String(...), ForeignKey('child.cid'))
)

class Parent():
    ....
    childs = relationship("Child", secondary = assign, backref = 'parent')

私はこれを行うことができることを知っています:

obj = session.query(Table).get(pk_id)
session.delete(obj)

しかし、次のようなデータベースへのアクセスは 1 つだけにしたいと思います。

session.query(Table).filter_by(id = pk_id).delete()

多対多の rel が原因でエラーが発生しました:

「親行を削除または更新できません: 外部キー制約が失敗しました...」

出来ますか?ありがとう

4

1 に答える 1

2

を使用session.query()すると、常に最初にデータベースからオブジェクトのデータが取得されます。これを回避するには、ORM オブジェクトに関連付けられたテーブル オブジェクトを直接使用する必要があります。

session.execute(Parent.__table__.delete().where(Parent.id==pk_id))

これにより、データベースに対して単一の DELETE sql ステートメントが発行され、親レコードが削除されます。(Parent.idは の同義語ですParent.__table__.c.id)

外部キー エラーを解決するには、最初に割り当てテーブルのレコードを削除する必要があります。

session.execute(assign.delete().where(assign.c.pid==pk_id))
于 2013-05-30T18:36:24.823 に答える