#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
метод делает именно это. Вы знакомы с определением двоичного столбца. Столбец типа sqlBINARY
идентифицируется как aMYSQL_TYPE_STRING
в драйвере. На самом деле то же, что и драйвер C. Но в драйвере c былis_binary
метод, разрешающий преобразование поля.