【问题标题】:web2py error: You might need to add explicit type castsweb2py 错误:您可能需要添加显式类型转换
【发布时间】:2015-04-07 09:24:55
【问题描述】:

我有 web2py 应用程序,我必须为其编写 SQL 查询。有一个名为 homework 的表,其中我感兴趣的列是 receiver。此列包含已收到作业的学生列表。 本栏目由

创建
db.define_table('homework',
Field('title'),
Field('description'),
Field('sender', db.auth_user),
Field('campus_class', db.campus_class),
Field('send_time', type='datetime'),
Field('completion_time_hw', type='integer'),
Field('attached_files', type='list:string'),
Field('created', type='datetime', default=request.now, writable=False, readable=False),
Field('modified', type='datetime', default=request.now, writable=False, readable=False),
Field('send_notification_on', type='datetime',  writable=False, readable=False),
Field('send_status', type='boolean', default=False),
Field('receiver', type='list:reference auth_user'),
)

我需要将这些列表值与另一个名为 student_guardian_relation 的表中的列 student 进行比较。

db.define_table('student_guardian_relation',
Field('student',db.auth_user, requires=IS_NULL_OR(IS_IN_DB(db(db.auth_user.user_role == UserRoles.Student),db.auth_user.id,'%(first_name)s %(last_name)s'))),
Field('guardian',db.auth_user, requires=IS_NULL_OR(IS_IN_DB(db(db.auth_user.user_role == UserRoles.Guardian),db.auth_user.id,'%(first_name)s %(last_name)s')))
)

但是当我尝试比较这两个值时,我得到一个错误,内容如下:

运算符不存在:text = integer LINE 1: ...rdian_relation, homework WHERE (homework.receiver = student_... ^ HINT: 没有运算符匹配给定的名称和参数类型(s)。您可能需要添加显式类型转换。

这就是我的代码的作用:

print db(db.homework.receiver == db.student_guardian_relation.student).select(db.homework.receiver)

附加信息:

当我写的时候:

print db().select(db.homework.receiver)

我得到了一个接收者列表,如图所示。 任何帮助将不胜感激。 谢谢!

【问题讨论】:

  • DB 中的某物是一个 int,而某物是一个字符串,而 postgres 告诉您它无法比较这两者……如果看不到一点,很难分辨哪个是哪个更多代码——你能发布实际的模型类吗?
  • 接收者是一个列表,我想将它与 int 中的学生 ID 进行比较。

标签: python sql web2py


【解决方案1】:

请注意,db.homework.receiverlist:reference 类型字段,因此它存储记录 ID 列表,而不是单个 ID。因此,您必须使用 .contains 运算符而不是 == 来检查特定 ID 是否包含在列表中。

在内部,list:reference 字段存储为带有“|”的文本字段分隔 ID 的字符(例如,“|1|5|12|32|”)。 web2py DAL 自动处理这种格式和 Python 列表之间的转换。无论如何,这就是您使用 == 运算符触发类型不匹配错误的原因(即,您的查询将字符串与整数进行比较)。

更多详情,请查看相关documentation

【讨论】:

  • 感谢您的解释。现在我明白了为什么我会收到错误以及为什么使用 .contains 来修复它。
【解决方案2】:

我终于解决了与比较行与 int 相关的问题。我用过

db((db.homework.receiver.contains(db.student_guardian_relation.student))

我认为无论类型如何,这都会比较两个表中的值(至少在我的情况下是这样的),您可以通过在此基础上进一步扩展查询。

【讨论】:

    猜你喜欢
    • 2017-06-28
    • 2019-05-27
    • 1970-01-01
    • 2020-06-16
    • 2013-09-09
    • 2017-07-16
    • 2018-11-08
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多