DatabaseError:用作表达式的子查询返回的多行(Django) [英] DatabaseError: more than one row returned by a subquery used as an expression (Django)

查看:844
本文介绍了DatabaseError:用作表达式的子查询返回的多行(Django)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试使用合并的查询集时,Django通过 DatabaseError 。我的代码是

  assetsNetwork = Asset.objects.filter(client = myClient,module__label__in = network_label_list)
vulnsNetworkRaw = Vuln .objects.none()
资产中的资产网络:
vulnsNetworkRaw = vulnsNetworkRaw | asset.latest_vulns
logging.debug(+++%s +++%vulnsNetworkRaw)

错误消息是

  DatabaseError:用作表达式的子查询返回的多个行

.latest_vulns方法是

  @property 
def latest_scan(self):
from arachni.models import WebScan,Vulns as WebVuln
my_module = self.module

try:
return Scan.objects.filter(assets__id = self.id,status ='Audit Complete')。最新('completed_Date')
除了:
返回Scan.objects.none()
@property
def latest_vulns(self):
from arachni.models import WebScan,Vulns as WebVuln
latest_scan = self.latest_scan
return Vuln.objects.filter(scan = latest_scan,host = self.IP_Address)

查询:

  2012-08-07 16:44:38 EDT声明:选择pegasus_vuln。id ,pegasus_vulnnvt_id,pegasus_vuln,scan_id,pegasus_vuln,host,pegasus_vuln,port,pegasus_vulnrisk_factor pegasus_vuln状态,pegasus_vuln,改变,pegasus_vuln,评论,pegasus_vuln,描述,pegasus_vuln WHERE((pegasus_vuln。host='192.168.2.251'ANDpegasus_vuln。scan_id= 95)OR(pegasus_vuln。host='192.168.2.5'ANDpegasus_vulnscan_id =(SELECT U0。idFROMpegasus_scanU0))OR(pegasus_vuln。host= '10 .1.10.244'ANDpegasus_vuln。scan_id= 109)OR(pegasus_vuln =192.168.2.5ANDpegasus_vuln。scan_id=(SELECT U0。idFROMpegasus_scanU0))OR(pegasus_vulnhost='192.168.2.248'ANDpegasus_vuln scan_id=(SELECT U0。idFROMpegasus_scanU0)))ORDER BYpegasus_vuln。_ orderASC LIMIT 21 
2012-08-07 16:44:38 EDT错误:多于一个使用的子查询返回的行作为表达式

它成功记录了几次,但在记录行中也出现错误。有人可以帮我吗非常感谢。

解决方案

这个问题已经很奇怪了。我添加日志记录 latest_vulns 来评估查询集,然后一切正常。即使我删除了日志记录,它也可以工作。


Django through a DatabaseError when I try to use a merged query set. My code is

assetsNetwork = Asset.objects.filter(client=myClient, module__label__in=network_label_list)
vulnsNetworkRaw = Vuln.objects.none()
for asset in assetsNetwork:
    vulnsNetworkRaw = vulnsNetworkRaw | asset.latest_vulns
    logging.debug("+++%s+++"%vulnsNetworkRaw)

The error message is

DatabaseError: more than one row returned by a subquery used as an expression

The .latest_vulns method is

@property
def latest_scan(self):
    from arachni.models import WebScan, Vulns as WebVuln
    my_module = self.module

    try:
        return Scan.objects.filter(assets__id=self.id, status='Audit Complete').latest('completed_Date')
    except:
        return Scan.objects.none()
@property
def latest_vulns(self):
    from arachni.models import WebScan, Vulns as WebVuln
    latest_scan = self.latest_scan
    return Vuln.objects.filter(scan=latest_scan, host=self.IP_Address)

Query:

2012-08-07 16:44:38 EDT STATEMENT:  SELECT "pegasus_vuln"."id", "pegasus_vuln"."nvt_id", "pegasus_vuln"."scan_id", "pegasus_vuln"."host", "pegasus_vuln"."port", "pegasus_vuln"."risk_factor", "pegasus_vuln"."cvss_score", "pegasus_vuln"."status", "pegasus_vuln"."change", "pegasus_vuln"."comment", "pegasus_vuln"."description", "pegasus_vuln"."solution", "pegasus_vuln"."_order" FROM "pegasus_vuln" WHERE (("pegasus_vuln"."host" = '192.168.2.251'  AND "pegasus_vuln"."scan_id" = 95 ) OR ("pegasus_vuln"."host" = '192.168.2.5'  AND "pegasus_vuln"."scan_id" =  (SELECT U0."id" FROM "pegasus_scan" U0)) OR ("pegasus_vuln"."host" = '10.1.10.244'  AND "pegasus_vuln"."scan_id" = 109 ) OR ("pegasus_vuln"."host" = '192.168.2.5'  AND "pegasus_vuln"."scan_id" =  (SELECT U0."id" FROM "pegasus_scan" U0)) OR ("pegasus_vuln"."host" = '192.168.2.248'  AND "pegasus_vuln"."scan_id" =  (SELECT U0."id" FROM "pegasus_scan" U0))) ORDER BY "pegasus_vuln"."_order" ASC LIMIT 21
2012-08-07 16:44:38 EDT ERROR:  more than one row returned by a subquery used as an expression

It successfully logs for several times, but gives an error also in the logging line. Could anybody help me? Thanks a lot.

解决方案

The problem have been solved weirdly. I added logging in latest_vulns to evaluate the query set, then everything works fine. It works even after I removed the logging.

这篇关于DatabaseError:用作表达式的子查询返回的多行(Django)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆