Получение значения из столбца или строки после запроса в Mysql или Mysql_async

#rust #mysql-connector

#Ржавчина #mysql-connector

Вопрос:

В примерах для всех драйверов Rust mysql предполагается, что данные попадают в известную структуру.

Далее мы видим сопоставление запроса со структурой платежа:

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

// Load payments from database. Type inference will work here.
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?;
 

Необходима схема таблицы и порядок.
Что делать, если произойдет невероятное и схема неизвестна. Или мы выдали SELECT * FROM payment , где порядок не соблюдается.

Я использую mysql_async, хотя кажется, что mysql — очень похожий API.

Мне удалось добраться до этого момента, отметив использование Row , поскольку тип неизвестен.

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

for row in vec.iter() {
     println!("Row: {:?}", row); 
     // Prints the row and shows the columns with Bytes value 
     // such as Row { firstname: Bytes("qCEgkGSJ.."), lastname: Bytes("lYmsvbhT..") ... }

     let columns = row.columns();

     for index in 0..columns.len() { // The index is needed for row.get below
          let col = amp;columns[index];

          println!("Type: {:?}", col.column_type()); // MYSQL_TYPE_STRING works
          println!("Name: {:?}", col.name_str()); // "firstname" correct

          // Now the difficulty. Not sure if we get the value from row
          // we can use the same index 
          // And it panics
          // And we ask for String because of the MYSQL_TYPE_STRING
          let v:std::option::Option<String>  = row.get(index);
 

запаниковал при «Не удалось извлечь alloc::string::String из значения»

Я не уверен, следует ли получать значение из row.get(index) и действителен ли индекс из столбца для строки.

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

1. Должен быть в состоянии получить его как Option< Value >

2. Option<Value> получает значение без паники. Но … как перейти к базовой строке, int или так далее.

3. джиперы. несмотря на свое название, to_sql() метод, похоже, возвращает строку, используя различные форматы

4. Value это перечисление, поэтому вы можете использовать сопоставление с образцом, чтобы извлечь из него соответствующие типы.

5. да, to_sql метод делает именно это. Вы знакомы с определением двоичного столбца. Столбец типа sql BINARY идентифицируется как a MYSQL_TYPE_STRING в драйвере. На самом деле то же, что и драйвер C. Но в драйвере c был is_binary метод, разрешающий преобразование поля.