【问题标题】:How to handle this Gql query object如何处理这个 Gql 查询对象
【发布时间】:2013-10-10 17:08:09
【问题描述】:
user_exists = db.GqlQuery("select * from User where user_id in '%s'" % username)

我正在尝试进行测试以查看特定用户 ID (user_id) 是否已存在于数据库 (User) 中。基本上,如果“user_exists”有任何结果,我想产生一个错误并重新呈现表单,如果它是空的,我想继续存储用户数据。如何判断 'user_exists' 是否包含结果?

我试过了,

if user_exists:

但这种情况每次都会过去。也就是说,对于我传入的每个名称,它总是正确的,无论它是否已经存在。

我也试过了,

if len(user_exists) > 0:

但是得到一个 Gql 查询对象没有 len 的错误。如果 user_exists 是一个 Gql 查询对象,我如何从中提取某种列表以便以我尝试的方式简单地检查它的内容?

我过去曾在 jinja 模板中使用 for 循环遍历此类对象,并且我认为该对象通常也可以被视为可迭代对象,例如列表。

【问题讨论】:

  • 需要注意的一点 - 这种“使用查询”的方法不能保证您不会创建重复的 user_id 考虑使用 user_id 作为实体的键。然后,这将允许您执行一个更有效的 get_by_id 并且您不能有重复。
  • 这已经在我脑海中闪过,但我不确定如何去做。不过,我没有理由不在文档中查找此内容。

标签: python google-app-engine google-cloud-datastore gql


【解决方案1】:

如果您在 GqlQuery 对象上调用 .get().fetch(1),您的代码将起作用。

例子:

user = db.GqlQuery("select * from User where user_id = :1", username).get()
if user:
    # now `user` will contain a value if the query returns a value or None if not

您应该更喜欢使用查询参数而不是字符串插值,因为使用 API 可以使您的代码不易受到 SQL 注入攻击。

【讨论】:

  • 上面提到的string-interpolation,是指使用%s吗?
  • 是的,没错:'this is %s interpolation' % 'string'docs.python.org/2/library/…
猜你喜欢
  • 2011-12-09
  • 2018-02-06
  • 2020-02-08
  • 2013-05-16
  • 2013-05-06
  • 2013-02-19
  • 2021-05-28
  • 1970-01-01
  • 2020-08-26
相关资源
最近更新 更多