2016-06-27 13 views
0

このメソッドを使用して行を削除することはできません。エラーなく実行されますが、行はdb(mysql)に残ります。同様のアプローチを使用して追加と更新を行っています。SQLAlchemy/Flask-SQLAlchemyで行を削除することはできません

基本的には、ParentPageTempにはないParentPage内の行を削除する意図で、ids(ParentPage.id)のリストを作成し、それらを一時テーブル(ParentPageTemp.id)と比較しています。追加私はParentPageとページの関係を持っています.ParentPageの削除に続いて、そのページの行を削除する必要があります。確かに、SQLAlchemyでの関係の私の理解は、最高で初心者です。

models.py views.pyで

class ParentPage(Model): 
    __tablename__ = 'parent_page' 
    id = Column(Integer, primary_key=True) 
    url = Column(String(255)) 

    def __repr__(self): 
     this_id = str(self.id) 
     return this_id 

class Page(Model): 
    __tablename__ = 'pages' 

    id = Column(Integer, ForeignKey('parent_page.id'), primary_key=True) 
    parent_id = Column(Integer, ForeignKey('parent_page.id')) 
    type = Column(String(255))  
    default_code = Column(String(255))  
    name = Column(String(255)) 
    header = Column(String(255)) 
    title = Column(String(255)) 
    keywords = Column(String(255))  
    description = Column((Text)) 
    priority = Column(String(255)) 
    list_price = Column((Float)) 
    standard_price = Column((Float)) 
    image_filename = Column((Text)) 
    image_alt_text = Column(String(255)) 
    pdf_filename = Column((Text)) 
    lastupdate = Column(Date) 

    page = relationship('ParentPage', foreign_keys=[id], backref='page') 
    parent = relationship('ParentPage', foreign_keys=[parent_id], backref='children') 

    def __repr__(self): 
     return self.name 

方法

def delete_temp_not_in_test(): 
    parent_test_ids = db.session.query(ParentPage.id).all() 
    print "parent in test - %s" % (parent_test_ids) 
    for item in parent_test_ids: 
     q = db.session.query(ParentPageTemp).get(item) 
     if q is None: 
      print "ID doesnt exist - %s" % (item) 
      db.session.query(Page).filter(Page.id==item).delete(synchronize_session='fetch') 
      db.session.query(ParentPage).filter(ParentPage.id==item).delete(synchronize_session='fetch') 
      db.session.commit() 
      print "%s deleted from Temp" % (item) 
      # return False 
     else: 
      print "ID is %s" % (q.id) 
      # return True 
    return 

感謝。

答えて

0

ページには2つの関係がありますが、ParentPageには何もありません。

は見てみましょう:ParentPageに

children = relationship("Page", backref='parent') 

を、あなたがそれを必要としないページのページの関係を削除します。http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-to-many

を追加します。

あなたの関係を1対1にしたいと思うかもしれません、それは非常に似ています。 http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-to-one

+0

ご協力ありがとうございます。次のようにforeignKeyParentPageと指定してください。残念ながら私はエラーが発生しています: " アプリケーションをインポートできませんでしたエラー:関係の親/子テーブル間の結合条件を判断できませんでしたParentPage.page - テーブルをリンクする複数の外部キーパスがあります 'foreign_keys'引数親テーブルへの外部キー参照を含むものとしてカウントされる列のリストを提供します。 "私はPagesに関係"子 "を追加します。 – geoffn

0

おそらく、これはあなたが望むものである:

1 - これにより、基本的にこのbackrefPageモデルに追加された属性のようになり、ParentPage表にbackref列をrelationship属性を追加し、言及し、 - Pageモデルで

class ParentPage(Model): 
    __tablename__ = 'parent_page' 
    id = Column(Integer, primary_key=True) 
    url = Column(String(255)) 
    pages = relationship('pages', backref='parentpage') 

    def __repr__(self): 
     this_id = str(self.id) 
     return this_id 

2:Pageモデルから、あなたは、対応するPageモデルのParentPageを得ることができます

class Page(Model): 
    __tablename__ = 'pages' 

    id = Column(Integer, primary_key=True) #Leave this as a primary key 
    parent_id = Column(Integer, ForeignKey('parent_page.id')) 
    type = Column(String(255)) 
    # ... 
+0

助けてくれてありがとう。あなたの例を使用して取り出す... ページ=(親ページ、foreign_keys = [ID]、バックリファレンス= 'ページ'削除機能はまだDBには影響しません。 – geoffn

+0

@geoffn ..私はあなたのコードで、あなたがこのコードを実行するときに得られる出力を投稿できるかどうか、私たちが問題を絞り込むのに役立ついくつかの 'print'式を持っているのを見ていますか... –

+0

ありがとう。私の印刷通話は、期待どおりに表示されます...正しいIDなど私はFlask-Appbuilderを使用していて、ParentPageを削除するためのネイティブのdeleteメソッドと、Pageの通常のSQLAlchemyの削除メソッドを使用して終了しました。私はあなたのモデル/関係のアドバイスがSQLAlchemyの削除に助けたと思います。 – geoffn

関連する問題