除非在 Python MySQL 中满足条件,否则运行 sql 查询

Run sql query unless condition fulfil in Python MySQL

提问人:Taimoor Pasha 提问时间:10/29/2022 更新时间:10/29/2022 访问量:142

问:

我有一个 cron 作业,它返回唯一 id,我将在 sql 查询中使用它,它返回具有该 id 的记录数,

假设 id = 78,表是 'Student',

现在我正在运行查询: ,query = select count(*) from students where id = 78

它会返回我 1,然后我会删除该记录,现在下次,它将是不同的 id.. 我想一次又一次地运行循环,直到它返回我 0 个计数。

现在我正在运行以下逻辑,但它不起作用:

def check_delete_link_between_student_account(self, student_id: int):
    count_query = None
    while count_query == 0:
        query = (f"DELETE FROM student "
                 f"WHERE student_id={student_id};")
        self.db_client.run_query(query)
        count_query = (f"SELECT COUNT(*) FROM {self.student} "
                       f"WHERE student_id={student_id};")
        self.db_client.run_query(count_query)

但它没有运行,我遇到了问题。

mysql python-3.x while循环

评论

0赞 Barmar 10/29/2022
当您开始循环时,该条件不成立,因为您之前在线路上这样做过。count_query == 0count_query = None
0赞 Taimoor Pasha 10/29/2022
你能分享一下正确的答案吗?
0赞 Barmar 10/29/2022
我不明白为什么你在这个函数中有循环。 在循环过程中不会改变。student_id
0赞 Barmar 10/29/2022
我猜你想要.但是,您需要设置为查询返回的值,而不是字符串。while count_query != 0:count_querySELECT COUNT(*)
0赞 Barmar 10/29/2022
您的问题说“下次会是不同的 ID”。id 在循环中如何变化?我认为您想要的是从函数返回计数,并在循环中调用函数。

答:

0赞 Barmar 10/29/2022 #1

你不应该把循环放在函数中,因为它不会改变。您应该使用不同的学生 ID 在循环中调用该函数。该函数应返回计数。student_id

您需要在删除行之前获取计数,否则计数将始终为 .0

def check_delete_link_between_student_account(self, student_id: int):
    self.db_client.cursor.execute(f"""
        SELECT COUNT(*) FROM {self.student}
        WHERE student_id = ?""", (student_id,))
    student_count = self.db_client.cursor.fetchone()[0]
    self.db_client.cursor.execute(f"
        DELETE FROM {self.student}
        WHERE student_id = ?""", (student_id,))
    return student_count

我已将查询更改为使用带有占位符的预准备语句。我不得不弥补从您的数据库连接中获取光标 - 您似乎没有使用众所周知的 ORM,所以我不知道实际代码应该是什么。并且可能需要更改为取决于您使用的数据库。self.db_client.cursor?%s

评论

0赞 Taimoor Pasha 10/29/2022
student_id是从cron job获取的id,这就是我提到的问题。
0赞 Barmar 10/29/2022
但是你说它应该在每次循环中改变,循环应该重复,直到计数为 0。它在你的问题中没有改变。