我有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)
我得到了一张接收器列表,如图所示。 任何帮助将不胜感激。 谢谢!
答案 0 :(得分:1)
请注意,db.homework.receiver
是list: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))
我认为这会比较两个表中的值而不管其类型(至少在我的情况下它会这样做)并且您可以通过构建此查询来进一步扩展查询。