web2py错误:您可能需要添加显式类型转换

时间:2015-02-07 06:21:58

标签: python sql web2py

我有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 的表中的学生列进行比较。

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')))
)

但是当我尝试比较这两个值时,我得到的错误是:

  

< class'psycopg2.ProgrammingError'>运算符不存在:text = integer LINE 1:... rdian_relation,homework WHERE(homework.receiver = student _... ^ HINT:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型管型。

这就是我的代码所做的:

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

其他信息:

当我写:

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

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

enter image description here

2 个答案:

答案 0 :(得分:1)

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

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

有关详细信息,请查看相关的documentation

答案 1 :(得分:0)

我终于解决了将行与int进行比较的问题。我用了

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

我认为这会比较两个表中的值而不管其类型(至少在我的情况下它会这样做)并且您可以通过构建此查询来进一步扩展查询。