Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions db/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ func NewDb(config Config) (*gorm.DB, error) {
slog.Error("Can't open database", "dsn", config.Dsn, "err", err)
return nil, err
}
if err = db.AutoMigrate(&models.TestingResult{}); err != nil {
slog.Error("Can't migrate TestingResult", "err", err)
return nil, err
}
if err = db.AutoMigrate(&models.Problem{}); err != nil {
slog.Error("Can't migrate Problem", "err", err)
return nil, err
Expand Down
9 changes: 8 additions & 1 deletion db/models/problem.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,14 @@ package models

import "gorm.io/gorm"

type ProblemType int

const (
ProblemType_ICPC ProblemType = iota + 1
ProblemType_IOI
)

type Problem struct {
gorm.Model
ProblemConfig
ProblemType ProblemType
}
13 changes: 0 additions & 13 deletions db/models/problem_config.go

This file was deleted.

8 changes: 4 additions & 4 deletions db/models/submission.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ import "gorm.io/gorm"

type Submission struct {
gorm.Model
TestingResult
ContentId uint64 // id of submission in the storage
TaskId uint64
TaskVersionId uint64
ProblemID uint64
ProblemVersionID uint64
TestingResultID int
TestingResult TestingResult
}
8 changes: 6 additions & 2 deletions db/models/testing_result.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package models

import "github.com/lib/pq"
import (
"github.com/lib/pq"
"gorm.io/gorm"
)

type Verdict int

const (
Verdict_OK int = iota
Verdict_OK Verdict = iota + 1
Verdict_WA
Verdict_TL
Verdict_ML
Expand All @@ -14,5 +17,6 @@ const (
)

type TestingResult struct {
gorm.Model
Verdicts pq.Int64Array `gorm:"type:int[]"`
}
57 changes: 57 additions & 0 deletions db/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Как пользоваться базой

### Подключаемся

```go
conn, err := db.NewDb(db.Config{Dsn: "DSN_STRING"})
if err != nil {...}
```

### Создание объекта

```go
config := &models.ProblemConfig{ProblemType: models.ProblemType_ICPC}
result := conn.Create(&config)
config.ID // номер нового объекта
result.Error // если была ошибка
result.RowsAffected // сколько строк вставилосб
```

https://gorm.io/docs/create.html

### Получение объекта (обычно одного)

```go
var problem Problem
var problems []Problem
err := conn.First(&problem)
// теперь либо err.Error != nil, либо в problem лежит запись с минимальным id
conn.Take(&problem) // рандомная запись
conn.Last(&problem) // последняя запись
errors.Is(result.Error, gorm.ErrRecordNotFound) // пример ошибки

result := map[string]interface{}{}
conn.Model(&models.Problem{}).First(&result) // после этого можно обращаться как к мапе

conn.Find(&problem, 1) // выбрать с id == 1
conn.Find(&problem, "id = ?", 1)
conn.Find(&problems, []int{1, 2, 3}) // выбрать с id \in {1, 2, 3}
conn.Find(&problems) // все объекты
```

https://gorm.io/docs/query.html

### Условия

```go
// все IOI задачи
conn.Where(models.Problem{ProblemType: models.ProblemType_IOI}).Find(&problems)
conn.Find(&problems, "problem_type = ?", models.ProblemType_IOI)
conn.Find(&problems, map[string]any{"problem_type": models.ProblemType_IOI})
conn.Not("problem_type = ?", models.ProblemType_ICPC).Find(&problems)
// все IOI задачи или с id == 1
conn.
Where("problem_type = ?", models.ProblemType_IOI).
Or(1).
Find(&problems)
```