Почему запрос mysql обновляет то, что не нужно?

#python #mysql #flask

Вопрос:

Я работаю над веб-инструментом в flask для автоматического создания файлов xls, поэтому я попытался создать своего рода редакцию строки в базе данных mysql, но загвоздка в том, что я хочу обновить значение только в том случае, если данные в веб-форме (не в базе данных) не являются нулевыми. Вот мой запрос

 UPDATE Servi 
SET Orden = CASE WHEN Orden IS NOT NULL THEN '%s' END,
    Dependencia = CASE WHEN Dependencia IS NOT NULL THEN '%s' END, 
    Atencion = CASE WHEN Atencion IS NOT NULL THEN '%s' END,  
    Recibio_del_cer = CASE WHEN Recibio_del_cer IS NOT NULL THEN '%s' END,   
    Entrego_al_cer = CASE WHEN Entrego_al_cer IS NOT NULL THEN '%s' END,   
    Folio = CASE WHEN Entrego_al_cer IS NOT NULL THEN '%s' END,    
    ...
    ...
    ...  
WHERE Orden=WHERE Orden='%s'
 

Теперь моя проблема здесь заключается в том, что запрос обновления много вещей, как null (я думаю), вот 2 фотографии, одна показывает данные из конкретных Orden рядом с текстовым полем для ввода новых данных в другую картинку мы видим, что происходит в строку, когда обновляется; здесь, в моем примере я изменил второе значение ( Dependencia ) из «полиции» к «транзитной» так и осталось пустым других мест

введите описание изображения здесь

введите описание изображения здесь

То, что я получаю, — это большая потеря данных, я не могу понять, что я делаю не так, даже то, что я делаю… вот код формы

 {% extends "base_template.html" %}
{% block title %}Registro de usuarios{% endblock %}
{% block content %}
    <form action="" method="post">
        <label for="Orden">Orden: </label>
        <input type="text" id="Orden" placeholder="{{data}}" name="Orden" required  /><br>
        <label for="Dependencia">Dependencia: </label>
        <input type="text" id="Dependencia" name="Dependencia" /><br>
        <label for="Atencion">Atencion: </label>
        <input type="text" id="Atencion" name="Atencion" /><br>
        <label for="Recibio_del_cer">Recibio del cer: </label>
        <input type="text" id="Recibio_del_cer" name="Recibio_del_cer" /><br>
        <label for="Entrego_al_cer">Entrego al cer: </label>
        <input type="text" id="Entrego_al_cer" name="Entrego_al_cer" /><br>
       ...
       ...
       ...
    
    <input type="submit" id="send-signup" name="signup" value="Registrar" />
</form>
{% endblock %}
 

Я надеюсь, что вы сможете мне помочь, я хочу изменить значение записи только в том случае, если в текстовом поле формы есть текст. Заранее спасибо

Изменить: это код, который я использую для применения запроса, надеюсь, это поможет

 def edicion_form(order):
   
        mycursor = conn.cursor()
        sql = "SELECT * FROM Servi WHERE Orden='%s'"%order
        mycursor.execute(sql)
        result = mycursor.fetchall()
        if request.method == 'POST':
            Orden = request.form['Orden']
            Dependencia = request.form['Dependencia']
            Atencion = request.form['Atencion']
            Recibio_del_cer = request.form['Recibio_del_cer']
            Entrego_al_cer = request.form['Entrego_al_cer']
            Folio = request.form['Folio']
            Entrada = request.form['Entrada']
            Equipo = request.form['Equipo']
            Marca = request.form['Marca']
            Modelo = request.form['Modelo']
            Serie = request.form['Serie']
            Unidad = request.form['Unidad']
            Delegacion = request.form['Delegacion']
            Accesorio = request.form['Accesorio']
            Falla = request.form['Falla']
            Ticket = request.form['Ticket']
            Status = request.form['Status']
            Reparacion = request.form['Reparacion']
            Salida = request.form['Salida']
            Reparo = request.form['Reparo']
            Servicio = request.form['Servicio']
            Reporte = request.form['Reporte']
            sql2  = "UPDATE Servi SET Orden= case when Orden is not null then '%s' ELSE Orden end, Dependencia=case when Dependencia is not null then '%s' ELSE Dependencia end, Atencion=case when Atencion is not null then '%s' ELSE Atencion end, Recibio_del_cer=case when Recibio_del_cer is not null then '%s' ELSE Recibio_del_cer end, Entrego_al_cer=case when Entrego_al_cer is not null then '%s' ELSE Entrego_al_cer end, Folio=case when Entrego_al_cer is not null then '%s' ELSE Folio end, Entrada=case when Entrego_al_cer is not null then '%s' ELSE Entrada end, Equipo=case when Equipo is not null then '%s' ELSE Equipo end, Marca=case when Marca is not null then '%s' ELSE Marca end,  Modelo=case when Modelo is not null then '%s' ELSE Modelo end,  Serie=case when Serie is not null then '%s' ELSE Serie end,  Unidad=case when Unidad is not null then '%s' ELSE Unidad end,  Delegacion=case when Delegacion is not null then '%s' ELSE Delegacion end,  Accesorio=case when Accesorio is not null then '%s' ELSE Accesorio end,  Falla=case when Falla is not null then '%s' ELSE Falla end,  Ticket=case when Ticket is not null then '%s' ELSE Ticket end, Status=case when Status is not null then '%s' ELSE Status end,  Reparacion=case when Reparacion is not null then '%s' ELSE Reparacion end, Salida=case when Salida is not null then '%s' ELSE Salida end, Reparo=case when Reparo is not null then '%s' ELSE Reparo end, Servicio=case when Servicio is not null then '%s' ELSE Servicio end, Reporte=case when Reporte is not null then '%s' ELSE Reporte end WHERE Orden='%s'" %(Orden, Dependencia, Atencion, Recibio_del_cer, Entrego_al_cer, Folio, Entrada, Equipo, Marca, Modelo, Serie, Unidad, Delegacion, Accesorio, Falla, Ticket, Status, Reparacion, Salida, Reparo, Servicio, Reporte, Orden)
            mycursor = conn.cursor()
            mycursor.execute(sql2)
            conn.commit()
            return redirect("/edicion")
 

Ответ №1:

Либо динамически создавайте свой запрос и включайте только те вещи, которые вы хотите изменить, либо добавляйте ЕЩЕ в каждый СЛУЧАЙ, который сохраняет текущее значение, например:

 Folio = CASE WHEN ... THEN ... ELSE Folio END
 

Но мне непонятно, почему вы так тестируете Orden IS NOT NULL ; то есть тестируете, если текущее значение не равно нулю, а не вводимые пользователем данные. Если вам нужна помощь в этом, вам нужно будет показать свой код, который создает запрос, а не форму.

Похоже, вы хотите проверить, является ли значение из формы непустым; вы бы сделали это так:

 Folio = CASE WHEN LENGTH('%s') THEN '%s' ELSE Folio END
 

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

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

1. ну, я хочу проверить, не является ли значение null, но не в базе данных, а в текстовом поле формы, я хочу изменить значение данных только в том случае, если текстовое поле формы для этого значения не равно нулю, главное здесь в том, что я хочу отредактировать значение в строке, но для этого мне нужно записать все записи в форме, поэтому я хочу отредактировать значение только в том случае, если текстовое поле в форме не пустое. построить его динамически было бы отличным вариантом, если бы я знал, как это сделать, я посмотрю, как это сделать, но я думаю, что проблема в том, что у меня есть разница между тем, что я хочу, и тем, что я прошу сделать

2. ввод из вашей формы не будет нулевым, это будут пустые строки. как я уже сказал, вам нужно будет показать свой код, который создает запрос

3. я обновил сообщение здесь, надеюсь, это поможет, должен ли я использовать «» для запроса?