【问题标题】:DatabaseError: more than one row returned by a subquery used as an expression (Django)DatabaseError:用作表达式的子查询返回的不止一行(Django)
【发布时间】:2012-08-04 22:13:25
【问题描述】:

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

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)

错误信息是

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

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

查询:

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

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

【问题讨论】:

  • 失败的查询是什么?
  • asset.latest_vulns 是一个列表。您可以将| 与列表一起使用吗?
  • @IgnacioVazquez-Abrams:通过编辑原始帖子添加了查询。谢谢。
  • | 不能与列表一起使用。您确定不打算使用 or 运算符而不是 |
  • 很酷,查询集可以与| 运算符一起使用。检查您的 SQL 嵌套语句,这些语句可能会返回多行,而您使用 = 而不是 IN 可能会返回多行。尝试独立执行 SQL。

标签: python sql database django django-models


【解决方案1】:

在您的 SQL 中检查这样的代码。如果可以从嵌套 SQL 中获取多个结果,则需要使用 IN 运算符。

"pegasus_vuln"."scan_id" =  (SELECT U0."id" FROM "pegasus_scan" U0))

【讨论】:

  • 您至少可以通过针对您用于测试的数据库运行查询来验证查询吗?
  • 查询可能不是问题,您的测试数据库中的数据可能是问题。
【解决方案2】:

问题已经奇怪地解决了。我添加了登录latest_vulns 来评估查询集,然后一切正常。即使在我删除了日志记录之后它仍然有效。

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2018-11-16
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多