### Column
カラムは、カラム名と制約が1対1になるので、hashmapを使用する
fn main() {
let mut columns = HashMap::new();
columns.insert("id", "integer");
columns.insert("name", "text");
columns.insert("age", "integer");
println!("{:?}", columns);
}
{“name”: “text”, “age”: “integer”, “id”: “integer”}
構造体で書くと以下のようになるが、かなり冗長だ。
#[derive(Debug)]
struct Column {
name: String,
constraint: String,
}
#[derive(Debug)]
struct Columns {
columns: Vec<Column>,
}
fn main() {
let columns = Columns {
columns: vec![
Column {
name: "id".to_string(),
constraint: "integer".to_string(),
},
Column {
name: "name".to_string(),
constraint: "text".to_string(),
},
Column {
name: "age".to_string(),
constraint: "integer".to_string(),
},
]
};
println!("{:?}", columns);
}
### Table
テーブルに対して、上記のカラムがある
#[derive(Debug)]
struct Column {
name: String,
constraint: String,
}
#[derive(Debug)]
struct Columns {
columns: Vec<Column>,
}
#[derive(Debug)]
struct Table {
name: String,
columns: Columns,
}
fn main() {
let columns = Columns {
columns: vec![
Column {
name: "id".to_string(),
constraint: "integer".to_string(),
},
Column {
name: "name".to_string(),
constraint: "text".to_string(),
},
Column {
name: "age".to_string(),
constraint: "integer".to_string(),
},
]
};
let table = Table {
name: "users".to_string(),
columns: columns,
};
println!("{:?}", table);
}
Table { name: “users”, columns: Columns { columns: [Column { name: “id”, constraint: “integer” }, Column { name: “name”, constraint: “text” }, Column { name: “age”, constraint: “integer” }] } }
### 実データを挿入する
#[derive(Debug)]
struct Column {
name: String,
constraint: String,
}
#[derive(Debug)]
struct Columns {
columns: Vec<Column>,
}
#[derive(Debug)]
struct Table {
name: String,
columns: Columns,
rows: Vec<Vec<String>>,
}
fn main() {
let columns = Columns {
columns: vec![
Column {
name: "id".to_string(),
constraint: "integer".to_string(),
},
Column {
name: "name".to_string(),
constraint: "text".to_string(),
},
Column {
name: "age".to_string(),
constraint: "integer".to_string(),
},
]
};
let rows = vec![
vec!["1".to_string(), "Alice".to_string(), "30".to_string()],
vec!["2".to_string(), "Bob".to_string(), "25".to_string()],
];
let table = Table {
name: "users".to_string(),
columns: columns,
rows: rows,
};
println!("{:?}", table);
}
### データ型をenumで定義する
#[derive(Debug, Clone)]
enum Value {
Integer(i32),
Float(f64),
Text(String),
Boolean(bool),
Date(NaiveDate),
DateTime(NaiveDateTime),
Time(NaiveTime),
Null,
Binary(Vec<u8>),
UUID(Uuid),
Json(JsonValue),
Decimal(Decimal),
}
データ挿入の書き方は以下のようになる。
let rows = vec![
vec![Value::Integer(1), Value::Text("Alice".to_string()), Value::Integer(30)],
vec![Value::Integer(2), Value::Text("Bob".to_string()), Value::Integer(25)],
];
Table { name: “users”, columns: Columns { columns: [Column { name: “id”, constraint: “integer” }, Column { name: “name”, constraint: “text” }, Column { name: “age”, constraint: “integer” }] }, rows: [[Integer(1), Text(“Alice”), Integer(30)], [Integer(2), Text(“Bob”), Integer(25)]] }
データ挿入のところをimplで書きたい。