我一直在学习数据库,并希望出于学习目的而非生产目的实施一个数据库。我有一个定义的模式:
type Row struct {
ID int32
Username string
Email string
}
现在,目前,我能够以仅附加的方式将这种类型的结构编码到文件中。
//Just to show i use a file for the encoding, it has missing details.
func NewEncoder(db *DB) *gob.Encoder{
return gob.NewEncoder(db.File)
}
func SerializeRow(r Row, encoder *gob.Encoder, db *DB) {
err := encoder.Encode(r)
if err != nil {
log.Println("encode error:", err)
}
}
现在,通过简单地解码整个文件来模仿“选择”语句相对容易gob.decode
func DeserializeRow(decoder *gob.Decoder, db *DB){
var rows Row
db.File.Seek(0, 0)
err := decoder.Decode(&rows)
for err == nil {
if err != nil {
log.Println("decode error:", err)
}
fmt.Printf("%d %s %s\n", rows.ID, rows.Username, rows.Email)
err = decoder.Decode(&rows)
}
}
我当前的问题是,我希望能够根据 ID 检索特定行。我知道sqlite使用 4kb 分页,在某种意义上,序列化的行占据一个“页面”,即。4KB 直到一个页面不能再容纳它们,然后创建另一个。我如何gob以最简单和惯用的方式模仿这种行为?
阿晨1998
相关分类