@Magus_Education

Как записать данные полученные в формате JSON в БД?

Всем привет. В рамках обучения получил задание, с сайта https://jsonplaceholder.typicode.com/ получить 5 постов и комментарии к ним. Уже прочитал и официальную документацию sql и json пакетов и как только не ухищрялся но возникает проблема: json декодирует array только в []interface{} Тогда как db.Exec принимает только interface{}.
Код мой на данный момент выглядит так https://play.golang.org/p/b08NgIPbF_Q. Сделать нужно именно с помощью https://pkg.go.dev/github.com/go-sql-driver/mysql#...", так что тот же GORM не выход, хотя с ним возникла примерно такая-же проблема
  • Вопрос задан
  • 323 просмотра
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Обратите внимание, что вы запрашиваете один пост, но в ответ приходит массив.
Это видно по скобкам вначале и конце ответа "[" .... "]",
[
  {
    "userId": 1,
    "id": 1,
    "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
    "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
  }
]

Т.е. декодировать ответ нужно как массив, а не отдельный пост

Исправил ошибки и отрефакторил ваш код.
Глобальные переменные тоже лучше не использовать.
Надеюсь так станет немного понятнее :)
Если будет что-то не понятно - пишите, постараюсь помочь.

В общем вот так будет работать.
package main

import (
    "database/sql"
    "encoding/json"
    "log"
    "net/http"

    _ "github.com/go-sql-driver/mysql"
)

type Post struct {
    Userid int    `json:"userId"`
    ID     int    `json:"id"`
    Title  string `json:"title"`
    Body   string `json:"body"`
}

func main() {
    posts, err := fetchPosts("https://jsonplaceholder.typicode.com/posts?id=1")
    if err != nil {
        log.Fatal(err)
    }

    db, err := sql.Open("mysql", "root:password@/Posts")
    if err != nil {
        log.Fatal(err)
    }

    err = savePosts(db, posts)
    if err != nil {
        log.Fatal(err)
    }
}

func fetchPosts(url string) ([]Post, error) {
    resp, err := http.Get(url)
    if err != nil {
        return nil, err
    }

    var posts []Post
    err = json.NewDecoder(resp.Body).Decode(&posts)
    return posts, err
}

func savePosts(db *sql.DB, posts []Post) error {
    for _, post := range posts {
        _, err := db.Exec("insert into post (id, user_id, title, body) values(?, ?, ?, ?)",
            post.ID, post.Userid, post.Title, post.Body)
        if err != nil {
            return err
        }
    }

    return nil
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы