Ответы пользователя по тегу SQL
  • Где у меня ошибка в sqlite3?

    @o5a
    order в SQL является ключевым словом. Поэтому лучше не использовать его в названиях таблиц, полей. На это и ругается.

    Если уж назвали, то заключайте в кавычки:
    return self.cursor.execute(f'INSERT INTO orders ("order", name, tg, number, amount, promo, date) VALUES (?, ?, ?, ?, ?, ?, ?)',
                                           [order, name, tg, number, amount, promo, date])
    Ответ написан
  • Почему не выдается баланс в телеграм боте?

    @o5a
    Уже много раз обсуждалось. НЕ добавляйте кавычки к названиям идентификаторов (таблиц, полей). Иначе это воспринимается как текстовая строка. Здесь например
    UPDATE 'users' SET 'balance' = ? WHERE 'chat_id' = ?
    Он будет пытаться обновить те записи, где СТРОКА 'chat_id' = какой-то там номер.
    Соответственно равны они не могут быть, и ничего не обновится.
    Не надо в запросах добавлять эти кавычки.
    Измените запрос так (и другие тоже заодно):
    self.cursor.execute("UPDATE users SET balance = ? WHERE chat_id = ?", (balance, chat_id,))
    Ответ написан
    3 комментария
  • Python. Как проверить, существует ли таблица в БД?

    @o5a
    Если просто проверить наличие таблицы, то можно запросом
    select * from pg_tables where tablename = 'value_result'

    Если же нужно именно ругаться, когда таблица не создалась или когда запись не получилась, то можно использовать try .. except с отловом конкретного кода ошибки
    try:
        cursor.execute(create_table_query)
    except НужноеИсключение:
        print("таблица уже существует")

    Какие конкретно исключения используется я навскидку не знаю, можно посмотреть в документации:
    https://www.psycopg.org/docs/errors.html
    или вывести опытным путем
    except Exception as e:
        print(e)
    Ответ написан
    Комментировать
  • Как сделать вывод одной определенной строки из БД?

    @o5a
    При данной постановке оптимально было бы выбрать все значения из базы в список (один раз, без сортировок), а затем перемешать его и при каждом запросе выдавать следующее значение по списку.
    # считать все свои тексты в список
    data = [row[0] for row in cur.execute("SELECT name FROM `test`")]
    random.shuffle(data) # теперь данные в рандомном порядке, можно выбирать последовательно


    Альтернативный вариант (допустим, этих текстовых данных в таблице очень много и может быть не эффективно тянуть и хранить их все сразу), считать список номеров, также отсортировать и при каждом запросе пользователя делать запрос к базе уже по номеру.

    # считать только уникальные номера этих текстов в список
    numbers = [row[0] for row in cur.execute("SELECT number FROM `test`")]
    random.shuffle(numbers) # теперь данные в рандомном порядке, можно выбирать последовательно
    
    # при запросе пользователя берем следующий номер из нашего рандомного списка
    number = ...
    # и по нему уже достаем сам текст из базы
    text = cur.execute("SELECT name FROM `test` where number = ?", (number, )).fetchone()[0]
    Ответ написан
    Комментировать
  • Как в таблицу SQL pypyodbc ввести данные?

    @o5a
    добавлял оценку в существующую строчку

    в SQL называется UPDATE
    mySQLQuery = (f'''update dbo.rating set `{subject}` = {appr} where id = '{your_id}')''')

    а лучше через передачу параметров
    mySQLQuery = f'''update dbo.rating set `{subject}` = %s where id = %s'''
    cursor.execute(mySQLQuery, (appr, your_id))
    Ответ написан
    Комментировать
  • Как правильно проверить?

    @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)
    Ответ написан
    Комментировать
  • Как правильно сравнить данные с переменной?

    @o5a
    Во-первых, fetchone возвращает кортеж, а не единственное значение, т.е. для получения имени нужно брать не user, а user[0]
    Во-вторых, для запросов с внешними значениями вместо форматирования строки лучше использовать передачу параметров.
    c.execute(f"UPDATE brothers SET ves=ves+500 WHERE name = ?", (user[0], ))


    И в целом этот код изменит значение только у записей первого пользователя выборки таблицы.
    Ответ написан
    1 комментарий
  • Sqlite3 возвращает только часть запроса, как исправить?

    @o5a
    Не совсем понятно, о чем речь, но запрос в шапке вообще никак не связан с полем id_q
    Если действительно используется указанный запрос, и данные не выбираются, возможно у Вас в поле answers (или наоборот в тексте вопроса) лишние пробелы. По скриншотам этого не оценить.
    Ответ написан
    3 комментария
  • Ошибка конвертирования SQL. Как исправить?

    @o5a
    Не особо знаком с pyodbc, но насколько понимаю, проблема в передаче значения без кавычек, т.е. select получается
    SELECT ACTIVE FROM [dbo].[BLAST_BLOCK] WHERE NAME =  4-20

    вместо корректного
    SELECT ACTIVE FROM [dbo].[BLAST_BLOCK] WHERE NAME =  '4-20'

    Лучше использовать передачу параметров вместо форматирования строки (именно для передачи значений полей), в таком случае не должно быть проблем с типами.
    cursor.execute('SELECT {} FROM {} WHERE NAME =  ?'.format(column, db_table), obj)
    Ответ написан
    2 комментария
  • Что надо сделать что бы Sqlite UPDATE заработал?

    @o5a
    В исполнении UPDATE user_info в параметрах используется name[0], а должно быть просто name.
    Ответ написан
    Комментировать
  • Как выбрать из одной таблицы повторяющийся записи SQL?

    @o5a
    Так добавьте умножение на ref
    SELECT ref, COUNT(ref)*ref as 'ref' FROM `users` WHERE status > 0 GROUP BY ref

    Вообще вопрос странный. Если не так понял, приведите пример, что хотите получить.
    Ответ написан
    Комментировать
  • Как сложить значения с null?

    @o5a
    Можно создать функцию, использующую varray, затем ее использовать для такого суммирования, например так:

    create type t_varr is varray(100) of number;
    
    create or replace function sum_varr(p_arr t_varr)
    return number IS
      v_res number;
    begin
      select sum(nvl(column_value,0)) into v_res
      from table(p_arr);
      return v_res;
    end;
    /
    
    with t as (select 1 a, null b, null c from dual union all
    select null a, null b, null c from dual union all
    select null a, 2 b, 3 c from dual union all
    select 5 a, 2 b, 1 c from dual)
    select t.*, sum_varr(t_varr(a,b,c))
    from t;
    Ответ написан
    Комментировать