2017-05-30 3 views
0
Department = models.department.Department 

association_table = Table('template_department', models.base.Base.instance().get_base().metadata, 
         Column('template_id', Integer, ForeignKey('templates.id')), 
         Column('department_id', Integer, ForeignKey('departments.id'))) 


class Template(models.base.Base.instance().get_base()): 

    __tablename__ = 'templates' 


    id = Column(Integer, primary_key=True) 
    tid = Column(String(7), unique=True) 
    .... 

    departments = relationship('Department', secondary=association_table) 

私は多くのtemplate_idとdepartmentの間の関係を削除しようとしていますが、実際にはそれを行うクエリを思いつくことはできません。どのようにSqlalchemyを使用してこれを行うには?Sqlalchemy:template_idとdepartmentの多対多関係の関連付けテーブル。関係を削除するにはどうしたらいいですか?

+0

「(template_id、department_id)タプルまたはそのようなタプルのセットに対して、「私は多くのtemplate_idと部門の関係を削除しようとしています」とは、 、または任意のidの間の任意の関係質問はそれほど明白ではない。 –

+0

関連テーブルから行を削除します –

+0

削除するtemplate_id、department_idのペアがありますか? –

答えて

1

MySQLでは、row constructorsIN-operatorを使用して、アソシエーションタグからペアを一致させる行を削除できます。

to_remove = [(1, 1), (2, 2), (3, 3), ...] 

あなたのセッションに存在するインスタンスは今含まれていてもよいので、これは、通常のORMの簿記をバイパスすることを、あなたは可能性が

from sqlalchemy import tuple_ 

stmt = association_table.delete().\ 
    where(tuple_(association_table.c.template_id, 
       association_table.c.department_id).in_(to_remove)) 

session.execute(stmt) 
... 

注:TEMPLATE_IDのリストを持っている場合たとえば、のようなペアをDEPARTMENT_ID失効したデータ。すぐにコミットし、必要に応じてデータをリロードするつもりなら、これは問題ではありません。

+0

department_id = 2などの特定の行を削除したい場合は、どのようにクエリを実行するのか教えてください。department_id = 2に関連するすべての行を見つけて、行を削除したい場合 –

+0

より単純で、 'where(association_table.c.department_id == 2)'だけです。おそらく失効したデータに関する同じ警告が適用されるため、一括削除の直後にコミットするか、セッションインスタンスを更新する必要があります。 ['Query.delete()'](http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.delete)のドキュメンテーションは、起こり得る問題を扱っています(例ではCoreを使用していても適用されます)。 –

+0

行202、_delete query = session.query(association_table).delete()。\ ファイル "/Users/royce/phoenix/lib/python3.5/site-packages/sqlalchemy/orm/query.py"、行3073、削除中 delete_op.exec_() ファイル "/Users/royce/phoenix/lib/python3.5/site-packages/sqlalchemy/orm/persistence.py"、行1126、exec_ self._do_pre_synchronize ) ファイル "/Users/royce/phoenix/lib/python3.5/site-packages/sqlalchemy/orm/persistence.py"、1180行目、_do_pre_synchronize target_cls = query._mapper_zero()。クラス_ AttributeError: 'テーブル'オブジェクトには属性がありません' class_ ' –

関連する問題