【问题标题】:Why is deleted data still shown in Sqlalchemy Flask?为什么 Sqlalchemy Flask 中仍显示已删除的数据?
【发布时间】:2020-12-02 22:03:45
【问题描述】:

我正在执行一项使用 sqlalchemy 将添加的页面删除到 postgresql 数据库的任务。 该页面正在从服务器中删除,但未能从数据库中删除。 这是删除页面的功能:

    def delete_page(self, page_id, application):

        # removed
        removed_from_everyone = True

        # fro campaign_id
        for campaign_id in self.bandit_campaigns:

            if page_id in self.bandit_pages[campaign_id].keys():

                # If the page is active
                if self.bandit_pages[campaign_id][page_id]:
                    removed_from_everyone = False

        # check if the page exist adn if it's not used by anyone
        if page_id in self.structure.keys() and removed_from_everyone:

            del self.structure[page_id]

            # for all the campaign
            for campaign_id in self.bandit_campaigns:
                # puts it in the new structure
                del self.bandit_pages[campaign_id][page_id]

            application.logger.info(f'page_id: {page_id}')
            application.logger.info(f'type page_id: {type(page_id)}')

            # remove arm
            self.remove_arm(page_id)

            application.logger.info(f'pages: {self.pages}')

            # Backup of the situation, in this case save only the pages
            # pickle.dump(self.structure, open('structure.pickle', "wb"))

            # this one store the last know status
            # pickle.dump(self.bandit_pages, open('bandit_pages.pickle', "wb"))

            try:
                pg = Structure.query.filter_by(page_url=page_id)
                db.session.delete(pg)

                bp = Bandit_pages.query.filter_by(campaign_id=campaign_id)
                db.session.delete(bp)
                db.session.commit()
            except Exception as e:
                print("exception in new page deletion", e)
                db.session.rollback()

这是创建 Structure 和 Bandit_page 表的代码:

class Structure(db.Model):
    __tablename__ = 'structure'

    arm_id = db.Column(db.Integer, primary_key=True)
    page_url = db.Column(db.String())

    
    def __init__(self, arm_id,page_url):
        self.arm_id = arm_id
        self.page_url = page_url

class Bandit_pages(db.Model):
    __tablename__ = 'bandit_pages'
    campaign_id = db.Column(db.String())
    arm_id = db.Column(db.Integer)
    status = db.Column(db.Boolean, default=False)
    __table_args__ = (
        PrimaryKeyConstraint('campaign_id', 'arm_id'),
        {},)

    def __init__(self, campaign_id, arm_id, status):
        self.campaign_id = campaign_id
        self.arm_id = arm_id
        self.status = status

我尝试了一种方法来删除它们,方法是使用 for 循环然后将其删除,但这并没有帮助。 另外添加页面的功能类似于删除页面功能,所以我不清楚我在哪里犯了错误。请帮帮我。谢谢!

【问题讨论】:

    标签: mysql python-3.x postgresql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    你可以试试这些命令 ->

    db.session.delete(我)

    db.session.commit()

    【讨论】:

      【解决方案2】:

      您的代码很复杂:您使用相同的循环多次使用相同的变量名。
      因此,您尝试仅删除 self.bandit_campaigns 中的最后一个值:

      bp = Bandit_pages.query.filter_by(campaign_id=campaign_id)
      db.session.delete(bp)
      db.session.commit()
      

      另外,我不确定self.self.bandit_campaigns 的键是你的字符串ID,也检查一下。 要从self.bandit_campaigns 中删除所有元素,您可以使用:
      db.session.query(Bandit_pages).filter(Bandit_pages.campaign_id.in_(your_list_of_values)).delete()

      【讨论】:

      • 我只想删除最后一个值,这就是为什么我多次使用相同的循环,还检查了字符串 id,我对其进行了硬编码,但令我惊讶的是,终端中显示了查询但它的结果没有反映在数据库中
      【解决方案3】:

      所以我自己解决了这个问题,发现这是一个被忽略的小错误。

                  try:
                      Structure.query.filter_by(page_url='ml3', arm_id=1).delete()  # .all()
                      #db.session.delete(pg)
                      Bandit_pages.query.filter_by(campaign_id='96879533', arm_id=1).delete()  # .all()
                      #db.session.delete(bp)
                      db.session.commit()
                      db.session.expire_all()
                  except Exception as e:
                      print("exception in new page deletion", e)
                      db.session.rollback()
      

      这段代码(我改了几行)运行良好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-26
        • 2021-01-03
        • 2020-03-26
        • 1970-01-01
        • 2016-03-27
        • 1970-01-01
        相关资源
        最近更新 更多