@ztx511

Как правильно проверить?

Вот у меня есть таблица cars
cursor.execute("""CREATE TABLE IF NOT EXISTS cars (
                id2 TEXT,
                honda INT,
                spyder INT,
                yamaha INT,
                ford INT,
                lancer INT, 
                nissan INT)""")
    conn.commit()

и она принимает шесть значение в виде числа, где 0 это у человека нету данной машины, а 1 есть.
Так вот как проверить какие у него есть машины, не проверять же все таким способом -
for row in cursor.execute(f"SELECT * FROM cars WHERE id2 = {ctx.author.id}"):
            if #проверка
            if #проверка
            if #проверка
            if #проверка
            if #проверка
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
@o5a
Как уже тут замечали, лучше использовать нормальную структуру, где по id пользователя привязываются все нужные типы машины (по 1 на каждую запись), т.е. таблица вида "user_cars(user_id, car)". Тогда можно будет за запрос сразу получить просто список машин пользователя "SELECT car FROM user_cars WHERE user_id = ..."

А при данной структуре можно слить значения в одну "цифровую" строку (и заодно использовать передачу параметров вместо форматирования текста)
cursor.execute(f"SELECT honda||spyder||yamaha||ford||lancer||nissan car_info FROM cars WHERE id2 = ?", (ctx.author.id, ))

В результате запрос возвратит скажем "001010" если у пользователя есть yamaha + lancer. Затем сравнить со списком машин. Например так
# допустим получили такую строку флагов из таблицы
car_flag = "001010"
# список машин в таком же порядке, как столбцы таблицы
cars = ['honda', 'spyder', 'yamaha', 'ford', 'lancer', 'nissan']
# сопоставляем нашу строку флагов со списком машин
user_cars = [car for car, flag in zip(cars, car_flag) if flag == "1"]
print(user_cars)
# ['yamaha', 'lancer']


--
Еще можно использовать названия полей напрямую из запроса через cursor.description, примерно так:
data = cursor.execute(f"SELECT * FROM cars WHERE id2 = ?", (ctx.author.id, ))
for value, name in zip(data, map(lambda x:x[0], cursor.description)):
    if value = 1:
        print(name)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@d-stream
Готовые решения - не подаю, но...
а потом у человека окажется две хонды...

стоит пересмотреть структуру ибо есть люди и есть авто, а авто имеет отношение к человеку
ну и далее - есть марки авто и есть конкретные автомобили одной из марок...
Ответ написан
Комментировать
jerwright
@jerwright
while True: coding()
Попробуйте так:
cursor.execute(f"SELECT * FROM cars WHERE id2 = {ctx.author.id}")
rows=sql.fetchone()
for i in rows:
    try:
        if int(rows[i])==1:
            print(f"Машина марки {i} есть в базе данных")
    except:
        pass
Ответ написан
Комментировать
@PavelMos
В таким виде имхо никак. Если именно такой вид нужен -отдельная колонка на каждую марку, то можно так
1) получить строку по id пользователя, кол-во элементов (1 или 0) в строке заранее известно и оно соответствует числу марок (список marka) .
2) сгенерировать словарь d={marka[x]:stroka[x] for x in range (0, len(makra))}
3) затем выбрать из словаря ключи (марки), где значения будут=1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы