es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Intentando incrementar automáticamente la clave primaria utilizando un desencadenador en Flask y almacenando en SQLPlus Oracle 10g.

@app.route("/indexf", methods=["POST","GET"])
def signup():
     conn = cx_Oracle.connect(user="SYSTEM", password="bnm")
     cur = conn.cursor()
     a1 = """"create sequence fid_seq""""
     ass = """" create trigger tfarmer
          before insert on farmeruser
           for each row
           begin
           select fid_seq.nextval
          into :new.fid
           from dual
           end;
           /"""


     if request.method == "POST":

            fname = request.form.get('fname')
            email = request.form.get('email')
            password = request.form.get('password')

            encpassword = generate_password_hash(password)

            execute = """INSERT INTO farmeruser VALUES (:fid,:fname,:email,:password)"""
            cur.execute(execute, {'fid':fid, 'fname':fname, 'email':email, 'password':encpassword})

            conn.commit()

     return render_template('indexf.html')

Aquí estoy tratando de obtener fname, email, password del usuario y autoincrementar fid que es una clave primaria utilizando disparadores. Pero no sé cómo pasar fid en Flask para autoincrementar.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    En el fragmento de código dado, se ha definido una función de ruta Flask llamada signup() para recibir datos de un formulario HTML utilizando el método de solicitud POST. La función se conecta a una base de datos Oracle y crea una secuencia llamada fid_seq utilizando una sentencia SQL. También crea un disparador llamado tfarmer que se dispara antes de insertar datos en la tabla farmeruser. El disparador asigna el siguiente valor de fid_seq a la columna fid de la tabla farmeruser.

    Para pasar el valor autoincrementado de fid a la aplicación Flask, puede modificar el código del disparador de la siguiente manera:

    CREATE OR REPLACE TRIGGER tfarmer
      BEFORE INSERT ON farmeruser
      FOR EACH ROW
    BEGIN
      :new.fid := fid_seq.NEXTVAL;
    END;
    

    Esto asignará el siguiente valor de fid_seq directamente a la columna fid de la tabla farmeruser durante una operación de inserción.

    Ahora, puede modificar el código de Flask de la siguiente manera:

    @app.route("/indexf",methods=["POST","GET"])
    def signup():
      conn = cx_Oracle.connect(user="SYSTEM", password="bnm")
      cur = conn.cursor()
    
      if request.method == "POST":
        fname = request.form.get('fname')
        email = request.form.get('email')
        password = request.form.get('password')
    
        encpassword = generate_password_hash(password)
    
        # Utilice un diccionario para proporcionar los valores de los parámetros para la sentencia INSERT
        params = {'fname': fname, 'email': email, 'password': encpassword}
        cur.execute("INSERT INTO farmeruser (fname, email, password) VALUES(:fname, :email, :password) RETURNING fid INTO :newid", params)
    
        # Obtenga el valor de fid generado automáticamente utilizando una nueva variable
        newid = cur.var(cx_Oracle.NUMBER)
        cur.execute("BEGIN :newid := fid_seq.CURRVAL; END;", newid)
    
        # Confirme los cambios en la base de datos
        conn.commit()
    
      # Cierre la conexión de la base de datos y devuelva la respuesta
      cur.close()
      conn.close()
      return render_template('indexf.html')
    

    En este código modificado, la sentencia INSERT se ha actualizado para utilizar una consulta parametrizada y una cláusula RETURNING que recupera el valor auto-generado de fid. El valor se almacena en una nueva variable llamada newid utilizando una variable de tipo cx_Oracle.NUMBER. Luego, la función fid_seq.CURRVAL se utiliza para recuperar el valor actual de fid_seq y asignarlo a newid. Por último, se cierra la conexión a la base de datos y se renderiza una plantilla de Flask.

    Ahora, debería poder generar automáticamente valores de fid para cada nuevo registro insertado en la tabla farmeruser utilizando Flask y disparadores de Oracle.

Comments are closed.