【问题标题】:Using SQLalchemy distinct function on Flask DB class在 Flask DB 类上使用 SQLalchemy distinct 函数
【发布时间】:2018-08-16 07:15:06
【问题描述】:

是否可以在不使用 sqlalchemy 中的“会话”类的情况下使用 distinct 函数?为什么或者为什么不?我在这里找到的答案:https://stackoverflow.com/a/35718413/10210394 似乎应该可以工作,但对我不起作用。请参见下面的示例:

class Example(db.Model):
     title = db.Column(db.String(140))
     extra = db.Column(db.String(140))

e1 = Example(title='foo', extra='bar')
e2 = Example(title='hoo', extra='bar')

db.session.add_all([e1, e2])
db.session.commit()

test = []
for value in Example.query.distinct(Example.extra):
    test.append(value.extra)

print(len(test))
...2

结果应该是 1 而不是 2。查看 distinct() 的文档,我觉得这应该可行。我错过了什么?

【问题讨论】:

  • 为什么这里的结果会是1? Example.extra 有两个不同的值:'bar''raa'。顺便说一句,这段代码没有运行,它有错误。最好在将代码发布到此处之前对其进行测试。
  • @zvone 对此感到抱歉,我正在从我的项目中复制代码并试图尽可能地简化它。现在应该修好了。我一定会在下次提交之前运行它。额外的变量应该是相同的(Example.extra: 'bar' and 'bar'),结果仍然是 2。
  • 你会在这里找到答案:stackoverflow.com/questions/17223174/…
  • @IljaEverilä 谢谢!

标签: python sqlite flask sqlalchemy distinct


【解决方案1】:

我找到了几种方法来完成我想要的。查看这个答案https://stackoverflow.com/a/17224056/10210394,为了获得不同的值 distinct() 必须在值上显式调用。要在课堂形式中做到这一点,可以使用“with_entities”

Example.query.with_entities(Example.extra).distinct()

另外,就我而言,一个简单的 group_by 也能达到预期的效果(但它可能不是 cmets 中指出的最佳/最便携的解决方案。)

 test = []
    for value in Example.query.group_by(Example.extra):
        test.append(value.extra)

 print (test)
 ....['bar']

【讨论】:

  • 请注意,您使用的 GROUP BY 方法会为其他列产生不确定的结果,或者换句话说,不能保证您从组中得到哪一行,因为Example.extra不确定其他列,或者没有功能依赖。大多数 SQL DBMS 会直接拒绝该查询。
  • @IljaEverilä 感谢您的提醒。我看到你评论了另一个问题stackoverflow.com/a/17224056/10210394,关于这个问题。我还注意到,在那个例子中 distinct(Tag.name) 没有做任何事情。就我而言,我不担心不确定的结果,那么使用该解决方案是否仍然可以接受?还是选择第一个选项来避免与其他 DBMS 不兼容的风险会更好?
  • 在我看来,SELECT DISTINCT extra 方法更正确,但在实用的意义上,例如在计数情况下,您不会通过分组获得不确定的结果,因为您忽略了其他结果列。但正如您自己在某种程度上提到的那样,学习使用便携式解决方案可能会更好。
  • 非常感谢您为我指明正确方向的所有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 2017-12-04
相关资源
最近更新 更多