• Почему db.Find сьедает одно из значений таблицы?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    99%, что дело в названиях полей
    Если из базы вы извлекаете данные в структуру Post - допишите там db:"userId", чтобы получилось примерно так
    UserId int `json:"userId" db:"userId"`
    или для gorm
    UserId int `json:"userId" gorm:"column:userId"`
    Ответ написан
  • Как отобразить данные в формате JSOn в виде строк в golang?

    romesses
    @romesses
    Backend инженер
    По сути, выход равен входу. За исключением того, что на входе
    массив объектов {id:, userId:, title: body:}
    а на выходе:
    массив объектов {ID:, userId:, title: body:}
    То есть id -> ID. Ну так из одной структуры скопировать значения в другую структуру с другими полями. При json.Marshal получится новый массив.
    как сделать вывод таким же красивым как и то что изначально?
    Это излишне: для компьютера это приводит лишь к дополнительным накладным расходам.
    Если "красоту" человек не будет смотреть где-то, то нет никакого смысла. Кроме того, в браузере в DevTools обычно встроено автоматическое выравнивание отступов, так что это не должно являться проблемой.

    Итого, текущая постановка задачи звучит как переливание из пустого в порожнее.
    Ответ написан
  • Как записать данные полученные в формате JSON в БД?

    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
    }
    Ответ написан