create_table("users", func(t) {
t.Column("email", "string", {})
t.Column("twitter_handle", "string", {"size": 50})
t.Column("age", "integer", {"default": 0})
t.Column("admin", "boolean", {"default": false})
t.Column("company_id", "uuid", {"default_raw": "uuid_generate_v1()"})
t.Column("bio", "text", {"null": true})
t.Column("joined_at", "timestamp", {})
})The create_table function will also generate an id column of type integer that will auto-increment. It will also generate two timestamp columns; created_at and updated_at.
Columns all have the same syntax. First is the name of the column. Second is the type of the field. Third is any options you want to set on that column.
stringtexttimestamp,time,datetimeintegerboolean
Any other type passed it will be be passed straight through to the underlying database. For example for PostgreSQL you could pass jsonband it will be supported, however, SQLite will yell very loudly at you if you do the same thing!
size- The size of the column. For example if you wanted avarchar(50)in Postgres you would do:t.Column("column_name", "string", {"size": 50})null- By default columns are not allowed to benull.default- The default value you want for this column. By default this isnull.
drop_table("table_name")rename_table("old_table_name", "new_table_name")add_column("table_name", "column_name", "string", {})See above for more details on column types and options.
rename_column("table_name", "old_column_name", "new_column_name")drop_column("table_name", "column_name")name- This defaults totable_name_column_name_idxunique
add_index("table_name", "column_name", {})add_index("table_name", ["column_1", "column_2"], {})add_index("table_name", "column_name", {"unique": true})add_index("table_name", "column_name", {}) # name => table_name_column_name_idx
add_index("table_name", "column_name", {"name": "custom_index_name"})rename_index("table_name", "old_index_name", "new_index_name")drop_index("table_name", "index_name")raw("select * from users;")All calls to raw must end with a ;!
Sometimes during a migration you need to shell out to an external command.
exec("echo hello")