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.

Obteniendo el valor de una columna o fila después de una consulta en Mysql o Mysql_async.

Los ejemplos para todos los controladores de MySQL en Rust asumen que los datos terminan en una estructura conocida.

A continuación, vemos una consulta que se asigna a una estructura de Pago:

struct Payment {
    customer_id: i32,
    amount: i32,
    account_name: Option<string>,
}

// Cargar pagos desde la base de datos. La inferencia de tipos funcionará aquí.
let loaded_payments = conn.exec_map(
    "SELECT customer_id, amount, account_name FROM payment",
    (),
    |(customer_id, amount, account_name)| Payment { customer_id, amount, account_name },
).await?;

Se necesita el esquema de la tabla y el orden. ¿Qué ocurre si sucede lo inimaginable y se desconoce el esquema? ¿O si emitimos SELECT * FROM payment y el orden no se sigue?

Estoy usando mysql_async, aunque parece que MySQL tiene una API muy similar.

Me las arreglé para llegar a este punto observando el uso de Row ya que el tipo es desconocido.

let results: Result<><row>> = conn.query("SELECT * FROM person LIMIT 1");

for row in results.iter() {
     println!("Fila: {:?}", row); 
     // Imprime la fila y muestra las columnas con valores de tipo Bytes
     // como Row { firstname: Bytes("qCEgkGSJ.."), lastname: Bytes("lYmsvbhT..") ... }

     let columns = row.columns();

     for index in 0..columns.len() { // El índice es necesario para row.get más abajo
          let col = &columns[index];

          println!("Tipo: {:?}", col.column_type()); // MYSQL_TYPE_STRING funciona
          println!("Nombre: {:?}", col.name_str()); // "firstname" correcto

          // Ahora la dificultad. No estoy seguro si obtenemos el valor de row
          // podemos usar el mismo índice
          // Y da un error
          // Y estamos solicitando un String debido a MYSQL_TYPE_STRING
          let v: Option<string> = row.get(index);
     }
}

panicked at 'Could not retrieve alloc::string::String from Value'

No estoy seguro de si obtener el valor de row.get(index) y si el índice de la columna es válido para row.

Tags:  ,

Answer

  1. Avatar for davy.ai

    R: Si el esquema es desconocido o se utiliza SELECT *, podemos utilizar el tipo Row para recuperar los datos de los resultados de la consulta. Sin embargo, como el tipo es desconocido, debemos iterar sobre las columnas en la Row para obtener sus tipos y nombres. Luego podemos utilizar el índice de una columna para recuperar su valor de la Row utilizando el método get. Sin embargo, el tipo del valor devuelto puede no coincidir con el tipo esperado, por lo que debemos utilizar las funciones de conversión adecuadas para convertirlo según sea necesario. También es posible que el índice no sea válido para la fila dada, lo cual puede causar panics, así que debemos asegurarnos de que el índice sea válido antes de utilizarlo.

Comments are closed.