MYSQL删除通过JDBC失败,并返回错误响应

时间:2018-09-21 05:30:26

标签: java mysql jdbc

我只有下面的代码库,并且可以手动正常运行。但是当我在jdbc驱动程序中使用它时会抛出异常。

代码:

class NoteRequestViewSet(viewsets.ModelViewSet):

    queryset = NoteInfo.objects.all()

    serializer_class = NoteInfoSerializer

    pagination_class = None
    print(queryset)
    print(serializer_class)

    def list(self, request):
       try:
            obj = self.get_queryset().get(
                Q(refno=pk) | Q(client_id=pk)
            )
            serializer = self.get_serializer(obj)
            return Response(serializer.data)

        except Exception as e:
            return Response(str(e))

例外:

  

java.sql.SQLException:子查询在处返回多于1行   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)在   com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)在   com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)在   com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)在   com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)

有线索吗?

2 个答案:

答案 0 :(得分:1)

我不知道您的数据或确切的逻辑,但是我建议对子查询而不是WHERE NOT IN使用<>逻辑:

DELETE
FROM tests
WHERE
    e2e_product_id = 410 AND
    test_name = 'PWBAR-FullBalance-Auth-TC1' AND
    test_id NOT IN (
        SELECT MAX_TEST_ID
        FROM (
            SELECT MAX(test_id) MAX_TEST_ID
            FROM tests
            WHERE e2e_product_id = 410
            GROUP BY test_name
            HAVING COUNT(*) > 1
        ) t
    );

这将绕过子查询返回多个结果错误。通常,您的子查询将为每个测试返回一个最大值。因此,假设您的逻辑是不想让test_id匹配 any 组,则上述逻辑应该是正确的。

答案 1 :(得分:0)

由于错误肯定表明我们返回的行数是多个,因此您应将test_id <>更改为test_id not in,然后将后面的部分放入括号中。