impl Tableで、jsonの保存、読み取り関数を書く。export_to_json()でjson化を関数にしているので、それを実行して、write_allで書き込む。読み取りの場合は、read_to_string()
fn save_to_file(&self, path: &str) -> Result<(), String> { let json = self.export_to_json(); let serialized = serde_json::to_string_pretty(&json) .map_err(|e| e.to_string())?; let mut file = File::create(path).map_err(|e| e.to_string())?; file.write_all(serialized.as_bytes()).map_err(|e| e.to_string())?; Ok(()) } fn load_from_file(path: &str) -> Result<Table, String> { let mut file = File::open(path).map_err(|e| e.to_string())?; let mut contents = String::new(); file.read_to_string(&mut contents).map_err(|e| e.to_string())?; let json: JsonValue = serde_json::from_str(&contents).map_err(|e| e.to_string())?; Table::import_from_json(&json) }
### 保存、読み取りの実行
サンプルテーブルは関数で別に作っておく
fn create_sample_table() -> Table { let mut schema = HashMap::new(); let mut order = vec![]; let columns = vec![ ("id", ColumnType::Integer, Constraint::PrimaryKey), ("name", ColumnType::Text, Constraint::None), ("age", ColumnType::Integer, Constraint::None), ]; for (i, (name, col_type, constraint)) in columns.into_iter().enumerate() { schema.insert(name.to_string(), ColumnSchema { order: i, column_type: col_type, constraint, }); order.push(name.to_string()); } let columns = Columns { schema, order }; let mut table = Table { name: "users".to_string(), columns: columns, rows: vec![], }; let result = table.insert_row(vec![ Value::Integer(1), Value::Text("Alice".to_string()), Value::Integer(30), ]); let result = table.insert_row(vec![ Value::Integer(2), Value::Text("Bob".to_string()), Value::Integer(25), ]); table }
let mut table = create_sample_table(); if let Err(e) = table.save_to_file("users.json") { eprintln!("保存に失敗しました: {}", e); } match Table::load_from_file("users.json") { Ok(loaded_table) => { println!("読み込み成功: {:?}", loaded_table); } Err(e) => { eprintln!("読み込み失敗: {}", e); } }
読み込み成功: Table { name: “users”, columns: Columns { schema: {“id”: ColumnSchema { order: 0, column_type: Integer, constraint: PrimaryKey }, “age”: ColumnSchema { order: 2, column_type: Integer, constraint: None }, “name”: ColumnSchema { order: 1, column_type: Text, constraint: None }}, order: [“id”, “name”, “age”] }, rows: [[Integer(1), Text(“Alice”), Integer(30)], [Integer(2), Text(“Bob”), Integer(25)]] }
### psqlのデータ保存
– 独自のフォーマットでファイルにテーブルデータを格納
– 各テーブルは内部的に「リレーション」として表され、base/ ディレクトリ以下にファイルとして存在
– PostgreSQL はデフォルトで 8KB 単位のページにデータを分割して保存
### mysqlのデータ保存
– 通常は /var/lib/mysql/ ディレクトリに保存されます。各データベースはサブディレクトリとして管理
– デフォルトでは1つの共有表領域ファイル(ibdata1)にすべてのデータを保存
どちらのDBMSも、保存しているファイルは バイナリ形式