1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
use csv::Writer; use postgres::{Client, NoTls, SimpleQueryMessage}; use std::error::Error; use std::fs::File; use std::path::PathBuf; pub fn export(db: &str, file_name: PathBuf, sql: &str, header: &str) -> Result<(), Box<dyn Error>> { let mut client = Client::connect(db, NoTls)?; let rows = client.simple_query(sql)?; let mut writer = csv::WriterBuilder::new() .quote_style(csv::QuoteStyle::NonNumeric) .from_path(&file_name)?; write_header(&mut writer, header)?; write_body(&mut writer, &rows)?; writer.flush()?; println!("Saved file to: {}", file_name.display()); Ok(()) } fn write_header(writer: &mut Writer<File>, header: &str) -> Result<(), Box<dyn Error>> { writer.write_record(header.split(',').map(|cell| cell.trim()))?; Ok(()) } fn write_body( writer: &mut Writer<File>, rows: &[SimpleQueryMessage], ) -> Result<(), Box<dyn Error>> { for row in rows { if let SimpleQueryMessage::Row(simple_row) = row { writer.write_record((0..simple_row.len()).map(|column_index| { simple_row .try_get(column_index) .unwrap_or_default() .unwrap_or_default() }))?; } } Ok(()) }