logo Buffalo slack logo
Fizz
Base de datos

Fizz

Fizz es un DSL común para migrar bases de datos. Intenta ser tan independiente posible de la base de datos. Este es el lenguaje por defecto que usa Pop para definir migraciones en base de datos.

Crear una tabla

create_table("users") {
  t.Column("email", "string", {})
  t.Column("twitter_handle", "string", {"size": 50})
  t.Column("age", "integer", {"default": 0})
  t.Column("admin", "bool", {"default": false})
  t.Column("company_id", "uuid", {"default_raw": "uuid_generate_v1()"})
  t.Column("bio", "text", {"null": true})
  t.Column("joined_at", "timestamp", {})
}

create_table("todos") {
  t.Column("user_id", "integer", {})
  t.Column("title", "string", {"size": 100})
  t.Column("details", "text", {"null": true})
  t.ForeignKey("user_id", {"users": ["id"]}, {"on_delete": "cascade"})
}

La columna id no tiene que ser un entero. Por ejemplo, en su lugar, puedes usar un tipo UUID:

create_table("users") {
  t.Column("id", "uuid", {primary: true})
  // ...
}

Por defecto, fizz generará dos columnas de tipo timestamp: created_at and updated_at.

El metodo t.Column toma los siguientes argumentos: Nombre de la columna, el tipo de campo y finalmente el último argumento es cualquier opción que deseas establecer a tu columna.

Tipos “Comunes”:

  • string
  • text
  • timestamp, time, datetime
  • integer
  • bool
  • uuid

Cualquier otro tipo pasado se pasará directamente a la base de datos subyacente.

Por ejemplo para PostgreSQL puedes pasar jsonb y podrá ser admitido, SQLite te gritará muy fuerte si haces lo mismo!

Opciones admitidas:

Opción Descripción Ejemplo
primary Si la columna es la llave primaria. Para llaves primarias compuestas, ve abajo {"primary": true}
size El tamaño de la columna. El valor predeterminado para una cadena es 255 (o 191 en MariaDB) {"size": 50}
scale, precision La escala y la precisión para una columna de tipo float {"scale": 4, "precision": 2}
null Por defecto las columnas no se permiten ser nulas {"null": true}
default El valor por defecto que deseas para tu columns. Por defecto es null {"default": 0} {"default": false} {"default": "foo"}
default_raw El valor predeterminado definido como una función de base de datos. {"default_raw": "uuid_generate_v1()"}
after (Solo para MySQL) Agrega una columna después de otra en la tabla. {"after": "created_at"}
first (Solo para MySQL) Agrega una columna en la primera pocisión en la tabla. {"first": true}

Deshabilitar marcas de tiempo automáticas

create_table("users") {
  t.Column("id", "uuid", {primary: true})
  // ...
  // Disable auto-creation of created_at and updated_at columns
  t.DisableTimestamps()
}

o

create_table("users", {timestamps: false}) {
  t.Column("id", "uuid", {primary: true})
  // ...
}

Borrar una tabla

drop_table("table_name")

Renombrar tabla

rename_table("old_table_name", "new_table_name")

Agregar una columna

add_column("table_name", "column_name", "string", {})

Mira arriba para mas detalles sobre tipos de columnas y opciones.

Alterar una columna

change_column("table_name", "column_name", "string", {})

Renombrar una columna

rename_column("table_name", "old_column_name", "new_column_name")

Borrar una columna

drop_column("table_name", "column_name")

Llaves primarias compuestas

t.PrimaryKey("column_1", "column_2")

Ten en cuenta que la declaración t.PrimaryKey DEBE estar después de las definiciones de las columnas.

Agregar un Index

Optiones admitidas:

  • name - Por defecto es: table_name_column_name_idx
  • unique

Index simple:

add_index("table_name", "column_name", {})

Index de varias columnas:

add_index("table_name", ["column_1", "column_2"], {})

Index unico:

add_index("table_name", "column_name", {"unique": true})

Nombre de Index:

add_index("table_name", "column_name", {}) // index name => table_name_column_name_idx
add_index("table_name", "column_name", {"name": "custom_index_name"})

Renombrar un Index

rename_index("table_name", "old_index_name", "new_index_name")

Borrar un Index

drop_index("table_name", "index_name")

Agregar una Llave foránea

add_foreign_key("table_name", "field", {"ref_table_name": ["ref_column"]}, {
    "name": "optional_fk_name",
    "on_delete": "action",
    "on_update": "action",
})

Opciones admitidas

  • name - Por defecto es: table_name_ref_table_name_ref_column_name_fk
  • on_delete - CASCADE, SET NULL, …
  • on_update
Nota: on_update y on_delete aun no son soportados en CockroachDB.

Borrar una Llave foránea

drop_foreign_key("table_name", "fk_name", {"if_exists": true})

Opciones admitidas

  • if_exists - Agrega la condición IF EXISTS

Raw SQL

sql("select * from users;")

Ejecutar un comando externo

A veces, durante una migración, debe pagar a un comando externo.

exec("echo hello")