2015-02-07 49 views
0

我有我必须编写SQL查询的web2py应用程序。有一张名为作业的表格,其中我感兴趣的列是接收器。此栏包含已收到作业的学生列表。 这列由web2py错误:您可能需要添加明确的类型转换

创建我需要将这些列表值在另一个表比较列学生称为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'> operator does not exist: text = integer LINE 1: ...rdian_relation, homework WHERE (homework.receiver = student_...^HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

这是我的代码呢:

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

附加信息:

当我写:

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

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

enter image description here

+0

DB中的某些东西是一个int,而某些东西是一个字符串,并且postgres告诉你它不能比较这两个东西......很难判断哪些是不能看到更多的代码, - 你可以发布实际的模型类吗? – kylewm 2015-02-07 07:20:22

+0

接收者是一个列表,我想将它与int中的学生ID进行比较。 – MJB 2015-02-07 08:04:54

回答

1

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

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

欲了解更多详情,请查阅相关documentation

+0

谢谢你的解释。现在我明白为什么我会收到错误以及为什么使用.contains修复它。 – MJB 2015-02-10 07:31:51

0

我终于解决了涉及与INT比较行的问题。我用

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

我觉得不管类型的比较,这两个表中的值(在我的情况下,至少它像是做到这一点),你可以通过建立在这一个进一步扩展您的查询。

相关问题