Refactor Schema

This commit is contained in:
Billy Chan 2021-11-11 15:11:52 +08:00
parent 64c54f8ad6
commit f504ad1eef
No known key found for this signature in database
GPG Key ID: A2D690CAC7DF3CC7
3 changed files with 30 additions and 13 deletions

View File

@ -9,27 +9,27 @@ use sea_query::{
impl Schema { impl Schema {
/// Creates Postgres enums from an Entity. See [TypeCreateStatement] for more details /// Creates Postgres enums from an Entity. See [TypeCreateStatement] for more details
pub fn create_enum_from_entity<E>(entity: E, db_backend: DbBackend) -> Vec<TypeCreateStatement> pub fn create_enum_from_entity<E>(&self, entity: E) -> Vec<TypeCreateStatement>
where where
E: EntityTrait, E: EntityTrait,
{ {
create_enum_from_entity(entity, db_backend) create_enum_from_entity(entity, self.backend)
} }
/// Creates a table from an Entity. See [TableCreateStatement] for more details /// Creates a table from an Entity. See [TableCreateStatement] for more details
pub fn create_table_from_entity<E>(entity: E, db_backend: DbBackend) -> TableCreateStatement pub fn create_table_from_entity<E>(&self, entity: E) -> TableCreateStatement
where where
E: EntityTrait, E: EntityTrait,
{ {
create_table_from_entity(entity, db_backend) create_table_from_entity(entity, self.backend)
} }
} }
pub(crate) fn create_enum_from_entity<E>(_: E, db_backend: DbBackend) -> Vec<TypeCreateStatement> pub(crate) fn create_enum_from_entity<E>(_: E, backend: DbBackend) -> Vec<TypeCreateStatement>
where where
E: EntityTrait, E: EntityTrait,
{ {
if matches!(db_backend, DbBackend::MySql | DbBackend::Sqlite) { if matches!(backend, DbBackend::MySql | DbBackend::Sqlite) {
return Vec::new(); return Vec::new();
} }
let mut vec = Vec::new(); let mut vec = Vec::new();
@ -52,7 +52,7 @@ where
vec vec
} }
pub(crate) fn create_table_from_entity<E>(entity: E, db_backend: DbBackend) -> TableCreateStatement pub(crate) fn create_table_from_entity<E>(entity: E, backend: DbBackend) -> TableCreateStatement
where where
E: EntityTrait, E: EntityTrait,
{ {
@ -61,7 +61,7 @@ where
for column in E::Column::iter() { for column in E::Column::iter() {
let orm_column_def = column.def(); let orm_column_def = column.def();
let types = match orm_column_def.col_type { let types = match orm_column_def.col_type {
ColumnType::Enum(s, variants) => match db_backend { ColumnType::Enum(s, variants) => match backend {
DbBackend::MySql => { DbBackend::MySql => {
ColumnType::Custom(format!("ENUM('{}')", variants.join("', '"))) ColumnType::Custom(format!("ENUM('{}')", variants.join("', '")))
} }
@ -175,8 +175,10 @@ mod tests {
#[test] #[test]
fn test_create_table_from_entity() { fn test_create_table_from_entity() {
let schema = Schema::new(DbBackend::MySql);
assert_eq!( assert_eq!(
Schema::create_table_from_entity(CakeFillingPrice, DbBackend::MySql) schema
.create_table_from_entity(CakeFillingPrice)
.to_string(MysqlQueryBuilder), .to_string(MysqlQueryBuilder),
Table::create() Table::create()
.table(CakeFillingPrice) .table(CakeFillingPrice)

View File

@ -1,5 +1,17 @@
use crate::DbBackend;
mod entity; mod entity;
/// This structure defines a schema for a table /// This is a helper struct to convert [`EntityTrait`](crate::EntityTrait)
/// into different [`sea_query`](crate::sea_query) statements.
#[derive(Debug)] #[derive(Debug)]
pub struct Schema; pub struct Schema {
backend: DbBackend,
}
impl Schema {
/// Create a helper for a specific database backend
pub fn new(backend: DbBackend) -> Self {
Self { backend }
}
}

View File

@ -108,7 +108,9 @@ where
} }
let expect_stmts: Vec<Statement> = creates.iter().map(|stmt| builder.build(stmt)).collect(); let expect_stmts: Vec<Statement> = creates.iter().map(|stmt| builder.build(stmt)).collect();
let create_from_entity_stmts: Vec<Statement> = Schema::create_enum_from_entity(entity, builder) let schema = Schema::new(builder);
let create_from_entity_stmts: Vec<Statement> = schema
.create_enum_from_entity(entity)
.iter() .iter()
.map(|stmt| builder.build(stmt)) .map(|stmt| builder.build(stmt))
.collect(); .collect();
@ -131,8 +133,9 @@ where
E: EntityTrait, E: EntityTrait,
{ {
let builder = db.get_database_backend(); let builder = db.get_database_backend();
let schema = Schema::new(builder);
assert_eq!( assert_eq!(
builder.build(&Schema::create_table_from_entity(entity, builder)), builder.build(&schema.create_table_from_entity(entity)),
builder.build(create) builder.build(create)
); );