В базе данных mysql не найдено совпадений с python, хотя результаты находятся в таблице

#python #mysql #python-3.x #mysql-workbench

#python #mysql #python-3.x #mysql-workbench

Вопрос:

У меня есть код, который генерирует случайное число, и база данных mysql, в которой есть некоторые числа, которые должны совпадать со многими случайно сгенерированными. Программа должна прерваться после обнаружения совпадения, однако она продолжает работать, даже если я вижу несколько сгенерированных совпадений. Я несколько раз перепроверил базу данных, и все цифры там. Я новичок в кодировании, поэтому, полагаю, я неправильно запрашиваю базу данных? Был бы признателен за любую помощь. Спасибо

 import random
import mysql.connector

mydb = mysql.connector.connect(
    host = "localhost",
    user = "root",
    passwd = "password",
    database = "testdb"
)


my_database = mydb.cursor()
sql_statement = "SELECT * FROM numbers"

my_database.execute(sql_statement)
output = my_database.fetchall()


while True:

    ran = random.randrange(100000,200000,100)

    if ran in output:
        print("MATCH!",ran)
        break
    else:
        print(ran)
'''


  

Комментарии:

1. fetchall() возвращает список кортежей. ran является целым числом, которое не равно кортежу (даже если кортеж содержит целое число в качестве единственного элемента). Вам нужно перебирать каждый кортеж.

2. Спасибо за ваш ответ. Вы имеете в виду добавление «для x в вывод:» в строке 16, а затем отступ для остальных?

3. Или, если в таблице есть только один столбец, вы могли бы сказать if (ran,) in output:

4. Это сработало! большое вам спасибо!

5. Вы выполняли какую-либо отладку? Я бы рекомендовал прочитать ericlippert.com/2014/03/05/how-to-debug-small-programs .

Ответ №1:

Согласно документации mysql python connector, fetchall() возвращает список кортежей. Поэтому вам нужно будет перебирать каждый кортеж и прерывать, когда ran находится внутри любого из кортежей. В качестве альтернативы вы можете использовать функцию any(), как я показываю ниже, которая была бы немного более питонической.

https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-fetchall.html

 while True:
    if any(ran in tup for tup in output):
        print("MATCH!", ran)
        break
    else:
        print(ran)