@webdiez
Меня все знают как WebDiez.

Как сделать умный запрос в sqllite на Python?

Есть столбцы в sql
bd_kay = ["user_name", "user_surname", "username", "phone_number"]
Есть переменные передаваемые в функцию
bd_data = ["Иван", "Иванов", "Ivan", "6666"]

сам запрос в sql
def db_table_upd(user_name: str, user_surname: str, username: str, phone_number:str, id_sql: str):
    cursor.execute('UPDATE users SET user_name = ?, user_surname = ?, username =?, phone_number= ? WHERE id = ?',
                   (user_name, user_surname, username, phone_number, id_sql))
    conn.commit()


Как сделать так чтоб данные из массива подставлялись и игнорировали не заполненные данные, например если мы вместо телефона передали пустоту.

UPDATE users SET bd_data = kay WHERE id = 0
Главное чтоб это один запрос был, а не несколько по разным столбцам.
  • Вопрос задан
  • 76 просмотров
Решения вопроса 1
@o5a
Чтобы оно не заменяло текущее значение при передаче None, можно использовать COALESCE. В таком случае оно просто возьмет следующее значение (которое мы указываем самим полем, т.е. старым значением.
"UPDATE users SET user_name = COALESCE(?, user_name), user_surname = COALESCE(?, user_surname), username = COALESCE(?, username), phone_number = COALESCE(?, phone_number) WHERE id = ?"

Если же нужно учитывать таким образом передачу не только None, но и пустой строки - '', то в конструкцию надо будет добавить:
SET user_name = COALESCE(NULLIF(?, ''), user_name),

и аналогично для каждого поля
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ну разве что синтезировать текст запроса - проходить по списку полей, если поле задано, прописываем его с плейсхолдером в секцию SET, а в список передаваемых значений добавляем подставляемое значение.
Иначе никак - насколько я знаю, SQL подразумевает что если ты не хочешь изменять значение поля в UPDATE, ты его просто не указываешь.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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