Fizz
Fizz 是一种比较常用的数据库迁移描述语言。为不同数据库迁移语法提供了通用性。是pop的默认用法。
建表
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"})
}
ID列不必是整数,也可以是UUID来代替:
create_table("users") {
t.Column("id", "uuid", {primary: true})
// ...
}
默认情况下会生成created_at 和 updated_at两个timestamp类型的列。
t.Column方法接受这么几个参数:第一个是列的名称,第二个是列的类型,最后一个是列的一些特殊配置。
通用的列类型
string
text
timestamp
,time
,datetime
integer
bool
uuid
还有一些其他的类型不是通用的,比如 PostgreSQL支持jsonb,然而SQLite 就不支持。
支持的配置选项
size
- 列的大小. 例如在数据库中varchar(50)
,对应的:t.Column("column_name", "string", {"size": 50})
scale
,precision
- scale 和 precision 对应的float列.example: {"scale": 4, "precision": 2}
null
- 默认的列是不允许为null
.default
- 列的默认值,默认情况下是null
.default_raw
- 数据库函数的默认值.after
- (MySQL Only) 加列在某个列之后.example: {"after":"created_at"}
first
- (MySQL Only) 加列到表的最前面.example: {"first": true}
禁用自动时间戳列
create_table("users") {
t.Column("id", "uuid", {primary: true})
// ...
// Disable auto-creation of created_at and updated_at columns
t.DisableTimestamps()
}
或者
create_table("users", {timestamps: false}) {
t.Column("id", "uuid", {primary: true})
// ...
}
删除数据表
drop_table("table_name")
表改名
rename_table("old_table_name", "new_table_name")
加一列
add_column("table_name", "column_name", "string", {})
列改变
change_column("table_name", "column_name", "string", {})
列改名
rename_column("table_name", "old_column_name", "new_column_name")
删除列
drop_column("table_name", "column_name")
添加索引
支持的选项
- name: 索引的名称,默认是table_name_column_name_idx
- unique
简单索引
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")
加外键
add_foreign_key("table_name", "field", {"ref_table_name": ["ref_column"]}, {
"name": "optional_fk_name",
"on_delete": "action",
"on_update": "action",
})
支持的选项:
name
- This defaults totable_name_ref_table_name_ref_column_name_fk
on_delete
-CASCADE
,SET NULL
, ...on_update
Note: on_update
和 on_delete
不被支持在CockroachDB上还.
删除外键
drop_foreign_key("table_name", "fk_name", {"if_exists": true})
支持的选项:
if_exists
- 加上IF EXISTS
条件
原生SQL语句
sql("select * from users;")
执行外部命令
exec("echo hello")