【问题标题】:Delete the row as soon as a column reaches a specific value列达到特定值后立即删除行
【发布时间】:2016-10-14 05:21:28
【问题描述】:

如果这是我的模特:

class Entity(Base):
    id = Column(Integer, primary_key=True)
    count = Column(Integer, default=0)

我想删除任何达到count 值 3(或任何数字)的行。 我怎样才能做到这一点? 我应该在我的 Web 应用程序的控制器中实现这样的删除吗?每次增加 count 时,我检查它的值是否为 3?我应该如何关心正在改变值的并发请求?什么是最好的解决方案?

【问题讨论】:

    标签: python postgresql concurrency sqlalchemy locking


    【解决方案1】:

    经过一段时间的思考和咨询专家,我发现解决这个问题的方法是在数据库中实现锁定或使用redis。由于在大量请求中加锁可能会导致性能问题,因此最好将count的值存储在redis数据库中,并尝试在特定时间段内更新对象关系数据库中的count值。

    【讨论】:

      【解决方案2】:

      我应该在我的网络应用程序的控制器中实现删除吗?

      是的。你应该在你的控制器中实现它。只需确保您的视图能够访问控制器中的 delete 函数即可。

      谁[如何]我可以这样做?

      简单。在您的控制器中,创建一个处理删除的函数。删除函数体应如下所示:

      limit = 3 # The value of this variable is arbitrary.
      Entity.query.filter(Entity.count == limit).delete()
      # The two statements above can be simplified to
      # Entity.query.filter(Entity.count == 3).delete()
      
      db.session.commit()
      

      更好的是,添加一个函数参数,该参数将接受一个值,该值将是一行中列的最大值。它可能看起来像这样:

      def delete_entity(limit=3): # I set `limit` to 3 since that is what you have stated earlier in the question
          Entity.query.filter(Entity.count == limit).delete()
          db.session.commit()
      

      每次计数增加时,我检查该值是否为 3?最好的解决方案是什么?

      这取决于您希望您的应用程序做什么。

      【讨论】:

      • 恐怕你的回答没有考虑并发请求影响count值的风险
      • 如果大约 1000 个 reuest 试图增加计数会发生什么?
      • @AminEtesamian 当我回答你的问题时,你还没有添加并发请求。
      • @Sean,WTF。考虑网络应用程序中的所有请求都是并发的。
      • @pylover 感谢您的更正。我的错。我忘了注意所有请求都必须被认为是并发的。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      相关资源
      最近更新 更多