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も、保存しているファイルは バイナリ形式