需求
創(chuàng)建數(shù)據(jù)表包含 created_at 字段為 timestamp 時(shí)間戳類型
Table::create()
.table(User::Entity)
.if_not_exists()
.col(ColumnDef::new(User::Id).uuid().not_null().primary_key())
.col(
ColumnDef::new(User::CreatedAt)
.timestamp()
.default() // <== 這里想設(shè)置默認(rèn)值 CURRENT_TIMESTAMP
.not_null(),
);
各種嘗試 SeaOrm 目前版本是v0.9 還不支持默認(rèn)值直接指定 current_timestamp
用關(guān)鍵字 current_timestamp 查找 sea-orm 項(xiàng)目 issues 列表
會(huì)查到這個(gè) issue: 自動(dòng)更新 create_at & updated_at 字段的時(shí)間戳問題
Automatically update created_at & updated_at timestamp columns on update
會(huì)鏈接到 PR: 在更新和插入時(shí)自動(dòng)更新時(shí)間戳的PR
auto set timestamp column when update & insert
PR中總結(jié)了時(shí)間戳自動(dòng)更新要處理的問題
1. 定義 timestamp 字段并指定默認(rèn)值為 CURRENT_TIMESTAMP
2. 針對(duì)不同的數(shù)據(jù)庫更新時(shí)間方案
- MySQL: https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html
- PostgreSQL: https://stackoverflow.com/a/1036010/7059723
- SQLite: No easy way to achieve it except https://stackoverflow.com/q/6578439/7059723
PR就提到了 sea-query 項(xiàng)目的 issue
Table Column with Default Expression
這個(gè) Issue就鏈接到了目前默認(rèn)值的解決方案: 如何使用 postgresql 的 current_timestamp 做為默認(rèn)值:
Can I use postgresql "CURRENT_TIMESTAMP" as a default value
解決方案
ColumnDef 支持 extra() 方法
.extra("DEFAULT CURRENT_TIMESTAMP".to_string())
源文件sea-query/tests/mysql/table.rs
#[test]
fn create_4() {
assert_eq!(
Table::create()
.table(Glyph::Table)
.col(
ColumnDef::new(Glyph::Id)
.integer()
.not_null()
.extra("ANYTHING I WANT TO SAY".to_owned())
)
.to_string(MysqlQueryBuilder),
vec![
"CREATE TABLE `glyph` (",
"`id` int NOT NULL ANYTHING I WANT TO SAY",
")",
]
.join(" ")
);
}