code_runner/migration/create_task_table.go

111 lines
2.8 KiB
Go

package main
import (
"code_runner/config"
"database/sql"
"fmt"
_ "github.com/lib/pq"
"log"
)
var (
postgresDb *sql.DB
)
func main() {
connStr := config.GetDSN()
var err error
postgresDb, err = sql.Open("postgres", connStr)
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}
defer postgresDb.Close()
err = postgresDb.Ping()
if err != nil {
log.Fatalf("Failed to ping database: %v", err)
}
createLangTableSQL := `
CREATE TABLE IF NOT EXISTS lang (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE
);`
_, err = postgresDb.Exec(createLangTableSQL)
if err != nil {
log.Fatalf("Failed to create lang table: %v", err)
}
_, err = postgresDb.Exec(`
INSERT INTO lang (name)
VALUES ('Python')
ON CONFLICT (name) DO NOTHING`)
if err != nil {
log.Fatalf("Failed to insert Python language: %v", err)
}
var pythonID int
err = postgresDb.QueryRow("SELECT id FROM lang WHERE name = 'Python'").Scan(&pythonID)
if err != nil {
log.Fatalf("Failed to get Python language ID: %v", err)
}
createTaskTableSQL := `
CREATE TABLE IF NOT EXISTS task (
id SERIAL PRIMARY KEY,
text TEXT NOT NULL,
id_lang INTEGER REFERENCES lang(id) ON DELETE SET NULL
);
CREATE INDEX IF NOT EXISTS id_task_id_lang ON task(id_lang);
`
_, err = postgresDb.Exec(createTaskTableSQL)
if err != nil {
log.Fatalf("Failed to create tasks table: %v", err)
}
createSolutionTableSQL := `
CREATE TABLE IF NOT EXISTS solution (
id SERIAL PRIMARY KEY,
id_task INTEGER NOT NULL REFERENCES task(id) ON DELETE CASCADE,
id_user INTEGER NOT NULL REFERENCES "user"(id) ON DELETE CASCADE,
code TEXT NOT NULL,
UNIQUE(id_task, id_user)
);
CREATE INDEX IF NOT EXISTS id_solution_id_task ON solution(id_task);
CREATE INDEX IF NOT EXISTS id_solution_id_user ON solution(id_user);
`
_, err = postgresDb.Exec(createSolutionTableSQL)
if err != nil {
log.Fatalf("Failed to create solutions table: %v", err)
}
tasks := []string{
"найдите сумму чисел от 1 до 10",
"напишите проверку на палиндром",
"напишите генератор чисел Фибоначчи до 10 числа",
"подсчитайте количество гласных в строке",
"напишите код который переносит строку в массив побуквенно",
}
for _, task := range tasks {
_, err = postgresDb.Exec(`
INSERT INTO task (text, id_lang)
VALUES ($1, $2)`, task, pythonID)
if err != nil {
log.Printf("Failed to insert task '%s': %v", task, err)
continue
}
}
fmt.Println("- Migration completed successfully")
fmt.Println("- Created lang, task and solution tables")
fmt.Println("- Added Python language")
fmt.Println("- Added 5 Python tasks")
fmt.Println("- Created solution table with foreign keys to task and user")
}