【问题标题】:PeeWee: Ignores foreign key constraintPeeWee:忽略外键约束
【发布时间】:2014-09-11 12:43:34
【问题描述】:
Job.select().where(Job.user == current_user.id and Job.status == "Running")

不断从错误的用户返回错误的行。它似乎完全忽略了Job.user == current_user.id 的声明。

我也试过

Job.select().join(User).where(Job.status == "Running")

同样,它不会返回属于当前用户的正确作业。

【问题讨论】:

  • 虽然我从未使用过 PeeWee,但文档似乎提到了where((Job.user == current_user.id) & (Job.status == "Running"))

标签: python sql flask peewee


【解决方案1】:

这里的问题是 and 不能转换为 SQL AND

事实上,它不能在任何库中做这样的事情。 and 运算符不能重载,如果第一个参数不真实,它会短路(不计算第二个参数),并且它总是返回它计算的最后一个参数。

所以,由于Job.user == current_user.id 返回一个非空查询对象,这是真的,Job.user == current_user.id and Job.status == "Running" 返回Job.status == "Running"。这就是为什么它忽略了current_user.id

使用& 运算符或bin_and 方法,如the docs 所说。

另外,请记住 & 的优先级与 and 不同,因此每次比较都需要括号。


至于你的第二次尝试,join 工作正常——它只是意味着Job 中的每一行都与User 中相应行的列连接在一起。您甚至没有尝试告诉它您要将其限制为哪个用户,它也无法读懂您的想法。

【讨论】:

  • 这是我对 PeeWee 最大的抱怨。搞清楚如何用 PeeWee 的方式做事比编写 SQL 查询需要更多的时间。
  • @user299709:与 SQLAlchemy 不同,PeeWee 的文档似乎希望您对 Python 和一般的 ORM 有很多了解。可能是因为这是一个主要由一个人编写的小项目。鉴于此,这些文档实际上令人印象深刻,而且他忽略记录对他来说显而易见的事情也就不足为奇了。但实际上,90% 的人们要求的内容 清楚地记录在 query operators 的一小部分中;我不知道为什么人们很难找到它。
  • 我并不是唯一一个发现 PeeWee 令人沮丧的人,在过渡或引入此类“你应该已经知道这一点,所以不会提出来”的过程中肯定存在一些潜在问题(比如你谈到的先决条件知识) )。我曾将 ORM 用于其他语言,但没有一次令人沮丧,因为文档中有丰富的示例查询。我认为确实可以通过提供更详尽的示例来改进 Peewee 文档。
  • @user299709:嗯,它是一个开源项目,你显然花了很多时间(和努力和挫折)来学习它,你知道它需要什么……你考虑过吗提交一些示例来改进文档,或者至少提交文档错误? (即使没有这些背景,您也可以从教程中搜索 SQLAlchemy 或 C#/LINQ 或许多其他不同语言的著名 ORM 的示例,并为所有您无法弄清楚如何在 PeeWee 中编写的文档提交错误通过搜索文档......但这对你来说可能会少一些工作。)
  • 为我的文档辩护,有一个快速入门旨在展示常见功能。它在安装后立即在文档中列出,涵盖了这些“常见情况”——peewee.readthedocs.org/en/latest/peewee/quickstart.html
猜你喜欢
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-15
  • 1970-01-01
  • 2018-12-07
  • 2012-04-12
  • 2017-04-21
相关资源
最近更新 更多