Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Cómo insertar registros en tablas relacionadas?
#1
Sad 
Saludos a la comunidad. Soy nuevo acá. Estoy desarrollando un proyecto flask y me he quedado varado en el CRUD de uno de los subsistemas del mismo. Tengo una tabla MySql llamada listservicios, esta tabla se relaciona con dos mas, la tabla umedida y la tabla gtrabajo. La tabla listservicios es el lado varios de la relación, las otras dos son el lado uno. Esta tiene los datos relativos a servicios tales como nombre, precio y además las llaves foráneas de las otras dos tablas. Una unidad de medida tiene varios servicios, al igual que un grupo de trabajo tiene varios servicios. Estoy intentando insertar un registro nuevo en la tabla listservicios, mediante el siguiente código:
Código:
@app.route('/servicios/crear')
def crear_servicio():
    conexion_MySQLdb = conectionBD() # Instanciando la conexión
    mycursor = conexion_MySQLdb.cursor(dictionary=True)
    querySQL = ("""SELECT DISTINCTROW umedida.nombreum, gtrabajo.nombregt FROM listservicios
                INNER JOIN umedida ON listservicios.idmedida = umedida.idmedida INNER JOIN gtrabajo ON listservicios.idgtrabajo = gtrabajo.idgtrabajo""")
    mycursor.execute(querySQL)
    datos = mycursor.fetchall()
    conexion_MySQLdb.close()
    return render_template("modulo_servicios/create.html", servicios = datos)
  Esta es la ruta donde llamo a la vista create.html que contiene el formulario:
Código:
<div class="card">
  <div class="card-header">Agregar Servicio</div>
  <div class="card-body">
    <form action="/servicios/crear/guardar" method="post">
      <div class="mb-3">
        <label for="" class="form-label">Nombre</label>
        <input
          type="text"
          class="form-control"
          name="nombre"
          id=""
          aria-describedby="helpId"
          placeholder="Ingrese el nombre del servicio"
        />
      </div>

      <div class="mb-3">
        <label for="" class="form-label">Precio MN</label>
        <input
          type="number"
          class="form-control"
          name="preciomn"
          id=""
          aria-describedby="helpId"
          placeholder="Precio del servicio en MN"
        />
      </div>

      <div class="mb-3">
        <label for="" class="form-label">Precio CUC</label>
        <input
          type="number"
          class="form-control"
          name="preciocuc"
          id=""
          aria-describedby="helpId"
          placeholder="Precio del servicicio en CUC"
        />
      </div>

      <div class="form-group">
        <label for="txtUnidadMedida">Unidades de Medida</label>
        <select class="form-control" name="idmedida" id="idmedida">
          {% for o in servicios %}
          <option value="{{ o.idmedida }}">{{ o.nombreum }}</option>
          {% endfor %}
        </select>
      </div>

      <div class="form-group">
        <label for="txtGrupoTrabajo">Grupos de Trabajo</label>
        <select class="form-control" name="idgtrabajo" id="idgtrabajo">
          {% for g in servicios %}
          <option value="{{ g.idgtrabajo }}">{{ g.nombregt }}</option>
          {% endfor %}
        </select>
      </div>

      <button type="submit" class="btn btn-primary">Guardar</button>
    </form>
  </div>
</div>
Acá está el formulario para la inserción de los datos. El primer problema que tengo acá con los dos select option es que me muestran todos los registros duplicados de las tablas umedida y gtrabajo. umedida solo tiene 8 registros, mientras que la gtrabajo solo tiene 4 registros. No he logrado que solo me muestre esos registros no sé el problema en la forma en la que construyo la query. Por otra parte cuando le doy al botón guardar de este formulario me lanza un error, el siguiente error:
DatabaseError mysql.connector.errors.DatabaseError: 1366 (HY000): Incorrect integer value: '' for column 'idmedida' at row 1.
Esta es mi ruta guardar:
Código:
@app.route('/servicios/crear/guardar', methods=['POST'])
def guardar_servicio():
    nombre = request.form['nombre']
    mn = request.form['preciomn']
    cuc = request.form['preciocuc']
    idmedida = request.form['idmedida']
    idgtrabajo = request.form['idgtrabajo']
   
    print(f'Nombre: {nombre}, MN: {mn}, CUC: {cuc}, IdMedida: {idmedida}, IdTrabajo: {idgtrabajo}')
   
    sql="INSERT INTO listservicios(nombre, mn, cuc, idmedida, idgtrabajo) VALUES (%s, %s, %s, %s, %s)"
    datos=(nombre, mn, cuc, idmedida, idgtrabajo)
    conexion_MySQLdb = conectionBD() # Instanciando la conexión
    mycursor = conexion_MySQLdb.cursor(dictionary=True)
    mycursor.execute(sql, datos)
    conexion_MySQLdb.commit()
    return redirect('/servicios')   

Cuando reviso los datos que introduzco en el formulario veo que me coge nombre, mn, cuc pero me manda vacio idmedida e idgtrabajo de ahí el error. Los select option, a pesar de los problemas que les plantee se llenan con la información correspondiente, desconozco porque no coge el id de cada uno y los inserta en la tabla listservicios que lleva idservicio de tipo autoincrementable por eso no lo mando, además de nombre, cuc, mn, idmedida, idgtrabajo. Espero no haberme extendido mucho pero expongo todo lo que puedo para ser entendido. Muchas gracias. Disculpen la longitud.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)