查询排除的行

时间:2017-02-07 19:06:01

标签: mysql python-2.7 flask-sqlalchemy

我有一个表格,我想在最近的100个(order by timestamp desc limit 100)之外选择行并删除它们。当然,我首选的是直接查询它们,但我认为不可能。

  1. 所以我的第一次尝试是返回子查询中100个最新行的ID,并将其用作父查询的一部分。这产生了一个奇怪的错误,说没有支持这样的操作:
  2. MySQL subquery restrictions

    1. 我找到了一个黑客,我可以将子查询包装在" select * from(...)foo" (并且它有效),但我不知道如何在SQLalchemy中对其进行建模。

    2. 我尝试递归内连接同一个表的两个实例,其中一个实例引用别名,但根据我看到的SQLalchemy示例,我不知道如何将限制应用于别名。

    3. 这是我尝试使用方法#1的尝试:

      注意:query1从100个最新行中选择id; query3选择从query1中排除的id以从query2中删除。

      `

      def rs_tagged_repos():
          return main.session.query(main.TaggedRepos)
      ...
      query1 = rs_tagged_repos()\
          .with_entities(main.TaggedRepos.id)\
          .filter(main.and_
              (
                    main.TaggedRepos.status == 'True'
                  , main.TaggedRepos.repoID == _repo['repo_id']
                  , main.TaggedRepos.scID == _repo['sc_id']
                  , main.TaggedRepos.category == _this_tag['category']
              )
          )\
          .order_by(main.TaggedRepos.timestamp.desc())\
          .limit(100)
      
      query2 = rs_tagged_repos() \
          .filter(main.and_
              (
                    main.TaggedRepos.status == 'True'
                  , main.TaggedRepos.repoID == _repo['repo_id']
                  , main.TaggedRepos.scID == _repo['sc_id']
                  , main.TaggedRepos.category == _this_tag['category']
              )
          )
      
      query3 = rs_tagged_repos()\
          .filter(
              ~main.TaggedRepos.id.in_(select0)
          )\
          .delete()
      

      `

      就像我说的那样,我很想知道直接做到这一点的方法,但此时我只需要一些有用的东西。感谢任何可行的帮助。

1 个答案:

答案 0 :(得分:0)

原来我可以使用.slice(x, y)直接查询我的设置。我只需要确保我的限制(y)是一个任意大的数字。

它的行为就像你使用"限制y偏移x"。

http://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.slice