建立数据表
建立一张新的数据表,用以保存单词,并且加上联合唯一索引uid, word
,限制单个用户不能添加相同的单词。
CREATE TABLE words (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
uid INT UNSIGNED NOT NULL,
word VARCHAR ( 255 ) NOT NULL,
definition TEXT,
example_sentence TEXT,
chinese_translation VARCHAR ( 255 ),
pronunciation VARCHAR ( 255 ),
proficiency_level SMALLINT UNSIGNED,
created_at DATETIME,
updated_at DATETIME
);
ALTER TABLE words ADD UNIQUE (uid, word);
字段名 | 类型 | 解释 |
---|---|---|
id | INT UNSIGNED | 主键,自动递增,唯一标识单词 |
uid | INT UNSIGNED | 用户id,标记该单词所属用户 |
word | VARCHAR(255) | 单词,不允许为空 |
definition | TEXT | 单词定义 |
example_sentence | TEXT | 示例句子 |
chinese_translation | VARCHAR(255) | 单词的中文翻译 |
pronunciation | VARCHAR(255) | 单词的发音 |
proficiency_level | SMALLINT | 单词掌握程度,1级最低,5级最高 |
created_at | DATETIME | 记录创建时间 |
updated_at | DATETIME | 记录最后更新时间 |
生成单词数据模型
$ gf gen dao
执行成功后,会生成下列文件:
internal/model/do/words.go
internal/model/entity/words.go
internal/dao/internal/words.go
internal/dao/words.go
自定义数据模型
像用户模型一样,如法炮制的在model
自定义一个数据模型,用作Logic
入参。
internal/model/words.go
package model
type ProficiencyLevel uint
const (
ProficiencyLevel1 ProficiencyLevel = iota + 1
ProficiencyLevel2
ProficiencyLevel3
ProficiencyLevel4
ProficiencyLevel5
)
type WordInput struct {
Uid uint
Word string
Definition string
ExampleSentence string
ChineseTranslation string
Pronunciation string
ProficiencyLevel ProficiencyLevel
}
在这里我们自定义了一个数据类型ProficiencyLevel
,表示单词的掌握程度,并定义了五个枚举值:ProficiencyLevel1-5
从低到高表示级别。
这种自定义类型加上固定枚举值的方式是一种高级的程序设计技巧,可以广泛用在各类状态上,比如订单状态,项目阶段等。新手在编程总喜欢使用int
一把梭,最后造成代码里全是1,2,3...
这种数字状态,导致代码的可读性和可维护性较差。