繁体   English   中英

无法使用SQLAlchemy / Flask-SQLAlchemy删除行

[英]Can't delete a row with SQLAlchemy / Flask-SQLAlchemy

我似乎无法使用此方法删除行。 它运行无误,但该行仍保留在数据库(mysql)中。 我已经使用类似的方法添加和更新了。

基本上,我正在创建一个id列表(ParentPage.id),并将其与临时表(ParentPageTemp.id)进行比较,目的是删除ParentPage中未在ParentPageTemp中找到的行。 另外,我在ParentPage和Page之间有关系,在删除ParentPage之后应删除Page中的行。 诚然,我对SQLAlchemy中关系的理解充其量只是新手。

models.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

views.py中的方法

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

谢谢。

您在Page上有两个关系,但在ParentPage中没有任何关系。

看一下: http : //docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-to-many

加:

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

到ParentPage并删除您不需要的Page页面上的页面关系。

编辑对不起,也许您想要一对一的关系,这非常相似。 http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html#one-to-one

可能,这就是您想要的:

1-添加一个relationship属性并在ParentPage表中提及backref列,基本上,此backref就像是向Page模型添加的属性一样,从Page模型中,您可以从中获取对应的Page模型的ParentPage

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模型中,仅将foreignKey指定为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))   
    # ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM