• Как сделать "swag init "?

    @Magus_Education Автор вопроса
    Ромзес Панагиотис, хм, попробую посмотреть что за Go modules, надеюсь это поможет добавить комментарии
  • Как сделать "swag init "?

    @Magus_Education Автор вопроса
    Ромзес Панагиотис, на англоязычных форумах я видел что-то из разряда "Настроить GOPATH", но вроде всё стоит как нужно
  • Как сделать "swag init "?

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

    @Magus_Education Автор вопроса
    Да, всё получилось. Теперь отображает корректно, спасибо
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    Евгений Мамонов, А вот и нет, программа запускается 1 раз, ибо отображение в консоль самого первого fmt.Println("Запрос постов"), происходит собственно 1 раз. Записывается дважды только
    for _, post := range posts {
        _, err := db.Exec("insert into post (id, userid, title, body) values(?, ?, ?, ?)",
          post.ID, post.Userid, post.Title, post.Body)
        if err != nil {
          return err
        }
      }

    Я добавлял в if err != nil отображение постов при ошибки и мне выдало все 10 постов. Добавив lof.Fatal выдало только 1. Но данные записываются, то есть записывая 10 постов, у меня ошибка при 11 записи, то бишь запись 10 постов происходит дважды
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    а я без IDE...
    GOLAND у меня как-то много жрёт оперативы и я решил пока писать в VScode, а запускаю я всегда через консоль
    Передумал кидать отдельно код(сохранял его)
    606c780f5fc10526612835.png
    606c781f38c04296662589.png
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    Евгений Мамонов, удаляю вручную через консоль и комментарии и посты
    Данные что в постах что в комментариях приходят правильные. Чётко от нужного до нужного поста, выводил уже в консоль и проверял это. И эти данные записываются. Проблема собственно в том что после записи, программа будто пытается записать первый элемент в срезе ещё раз, хотя после range должна обрываться на последнем
    Ещё странный момент что сработавший log.Fatal в цикле внутри функции записи постов не останавливает всю программу. Точнее даже не так. Останавливает, но почему-то запись комментариев всеравно происходит,но не print, не log.fatal в этих функциях не отображается в консоль
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    Евгений Мамонов, ради интереса переместил log.Fatal в цикл, вместо возврата функции и программа продолжается, хотя свой fatal error я и получил.
    А сделав так
    if err != nil {
    			fmt.Println(post)
    			log.Fatal(err)
    			//return err
    		}

    Я получил полностью заполненную таблицу,fatal.err на этом уровне не остановил всю программу, и 61 пост в консоли.
    Вот только вопрос. После этого я не получил ошибки номер 2, связанной с тем что 301 ключ уже есть(скрин в ответе выше). Повключав log.Fatal то там, то там. Я пришёл к выводу что log.Fatal останавливает в рамках своей функции. Но при этом все остальные, включая другие функции, if err!= null тоже перестали отображаться после этой Log.Fatal. без него покажет все ошибки, но с ним всё последующее в консоль блокируется. Правильно я понял?
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    А во и да, но вот и нет) Помню что точно менял это, но видимо когда переделывал код второй раз забыл. Но проблему это не решило. Программа просто не доходит до нужного момента.
    Начал писать ответ, придумал костыль и ушёл его делать, хех. Собственно - костыль я сделал. Но откуда берётся ошибка я так и не понял. Сейчас у меня 2 около проблемы
    1) Иногда по не обьяснимой причине или принимается вместо 10 постов, все 100, или просто случайное количество постов. В предпоследней попытки записалось комментариев вместо 50, 40 почему-то. Перезапустил, всё было так. Может ли это быть проблема интернет соединения и тут ничего не поделать?
    2) Собственно, проблема описанная выше. Представляю код который с костылем справляется с задачей
    package main
    
    import (
    	"database/sql"
    	"encoding/json"
    	"fmt"
    	"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"`
    }
    type Comment struct {
    	Postid int    `json:"postId"`
    	ID     int    `json:"id"`
    	Name   string `json:"name"`
    	Email  string `json:"email"`
    	Body   string `json:"body"`
    }
    
    func main() {
    	fmt.Println("Запрос постов")
    	posts, err := fetchPosts("https://jsonplaceholder.typicode.com/posts?userId=7")
    	if err != nil {
    		log.Fatal(err)
    	}
    	fmt.Println("Открытие базы данных")
    	db, err := sql.Open("mysql", "root:dkvjeoc582@/Posts")
    	if err != nil {
    		log.Fatal(err)
    	}
    	fmt.Println("СОхранение постов")
    	err = savePosts(db, posts)
    	if err != nil {
    		//log.Fatal(err)
    	}
    	fmt.Println("А вот тут ошибка c сохранению постов которая с Log.Fatal крашила всё")
    
    	fmt.Println("Получение и сохранение комментов")
    	err = saveComments(db, posts)
    	if err != nil {
    		fmt.Println("Получил ошибку и в комментах")
    		log.Fatal(err)
    	}
    	fmt.Println("а в комментах всё работает, лол")
    }
    
    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, userid, title, body) values(?, ?, ?, ?)",
    			post.ID, post.Userid, post.Title, post.Body)
    		if err != nil {
    			return err
    		}
    	}
    
    	return nil
    }
    
    func saveComments(db *sql.DB, posts []Post) error {
    
    	for _, post := range posts {
    		comments, err := fetchComments(fmt.Sprintf("https://jsonplaceholder.typicode.com/posts/%v/comments", post.ID))
    
    		if err != nil {
    			return err
    		}
    
    		for _, comment := range comments {
    			_, err = db.Exec("insert into comments (ID, postid, name,email, body) values(?, ?, ?, ?, ?)",
    				comment.ID, comment.Postid, comment.Name, comment.Email, comment.Body)
    			if err != nil {
    				return err
    			}
    		}
    
    	}
    
    	return nil
    }
    
    func fetchComments(url string) ([]Comment, error) {
    
    	resp, err := http.Get(url)
    	if err != nil {
    		return nil, err
    	}
    	var Comments []Comment
    	err = json.NewDecoder(resp.Body).Decode(&Comments)
    
    	return Comments, err
    }

    И добавил выводов в консоль для наглядности
    606b78786ec13450448102.png
    Собственно почему так я не понимаю, ибо принимается именно с чётко нужное, с 61 поста до 70. Я вывод в консоль, проверял. Но почему-то при записи оно, судя по всему начинается с начала.
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    Евгений Мамонов, Что примечательно я поэкспереминтировал и вот что получил: неважно с какого по какой пост я хочу получить, мне будет выдавать ошибку про то что 1 пост из тех что я запрашиваю уже записан. При этом сами посты записываются
    НО! У меня были записаны посты с 61 по 70 и я решил получить от 51 до 80. Я ожидал что будет ошибка: 61 Ключ уже существует и на нём запись закончится. Но вместо этого мне выдало ошибку про то что 51(!) ключ существует и я получил в БД посты от 51 до 70, без 71-80. То есть по идея ошибка вышла на 61, но выдало про 51.
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    Евгений Мамонов, и снова я. У меня выпрыгнула ошибка которой я не придавал значение, но что-бы выполнить основное задание (получить посты и комментарии к ним) мне таки прийдётся с ней столкнуть, а мне вот прям не вдомёк откуда это берётся, ведь по идее range идёт от 1 значения к последнему, а тут будто оно запускается по второму разу. Собственно скрин ошибки 606b3d1e91156412905165.png
    На момент записи в БД я её полностью очищаю и данные записываются, все 10 постов которые должны
    Вообще у моего задания есть 2 решения: получить Срез структур постов внутри которого структура с комментариями. Но я не разобрался как обратить к вложенной структуре, так что решил выбрать второй путь. Я получаю посты(собственно всё отлично) и после этого получаю комментарии, в качестве ссылки используя обращение к вложенным ресурсам, обернутые в Sprintf дабы вставить нужную переменную. Но до комментариев дело не доходит из-за этой ошибки, которая была и в изначальном коде
    Мой текущий код, на всякий случай :
    package main
    
    import (
    	"database/sql"
    	"encoding/json"
    	"fmt"
    	"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"`
    }
    type Comment struct {
    	Postid int    `json:"postId"`
    	ID     int    `json:"id"`
    	Name   string `json:"name"`
    	Email  string `json:"email"`
    	Body   string `json:"body"`
    }
    
    func main() {
    	posts, err := fetchPosts("https://jsonplaceholder.typicode.com/posts?userId=7")
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	db, err := sql.Open("mysql", "root:dkvjeoc582@/Posts")
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	err = savePosts(db, posts)
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	err = saveComments(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, userid, title, body) values(?, ?, ?, ?)",
    			post.ID, post.Userid, post.Title, post.Body)
    		if err != nil {
    			return err
    		}
    	}
    
    	return nil
    }
    
    func saveComments(db *sql.DB, posts []Post) error {
    
    	for _, post := range posts {
    		comments, err := fetchComments(fmt.Sprintf("https://jsonplaceholder.typicode.com/posts/%v/comments", post.ID))
    		if err != nil {
    			return err
    		}
    
    		for _, comment := range comments {
    			_, err = db.Exec("insert into post (ID, postid, name,email, body) values(?, ?, ?, ?, ?)",
    				comment.ID, comment.Postid, comment.Name, comment.Email, comment.Body)
    			if err != nil {
    				return err
    			}
    		}
    
    	}
    
    	return nil
    }
    
    func fetchComments(url string) ([]Comment, error) {
    
    	resp, err := http.Get(url)
    	if err != nil {
    		return nil, err
    	}
    	var Comments []Comment
    	err = json.NewDecoder(resp.Body).Decode(&Comments)
    
    	return Comments, err
    }
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    Евгений Мамонов, PS. Открыв сайт я увидел что ссылка на документации была в заголовке Powered by. Будет для меня уроков внимательно и методично всё читать
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    Евгений Мамонов, вау, ровно то что я хотел нашёл в документации. Большое спасибо, вы меня очень выручили.
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    Евгений Мамонов, 1,2) Понял, спасибо большое
    3) Но так мы получим в целом все посты, а не только нужные. Или кроме как "?id=1" взять точечно посты не получится?
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    Невероятно но да, нужно только мне самому доработать БД, добавить ключи, 2 таблицу для комментариев и прочее. Огромное спасибо
    Я не все "инструменты" понял, но как они работают понял почти везде, есть только 3 вопроса:
    1) В этой функции в качестве аргументов мы принимает БД и массив структуры. А что мы делаем в этом цикле?
    for _, post := range posts
    Раньше в коде у меня была похожая структура, но это не помогло, скорее всего из-за неправильного декодинга.
    2)json.NewDecoder(resp.Body).Decode(&posts)
    Я прочитал что написано в документации по json но не очень понял что значит
    The decoder introduces its own buffering and may read data from r beyond the JSON values requested.

    Собственно я понимаю что делает строчка, но не понимаю чем она отличается от прошлого варианта
    3)Тут всё понятно, скорее вера в то что можно проще. Как можно вместо ?id=1 в ссылке вставить переменную что-бы получить к примеру от 50 до 58 поста.
    Ещё раз огромное спасибо, я уже неделю бьюсь над этой задачей, надо было сразу писать на хабр))
  • Как записать данные полученные в формате JSON в БД?

    @Magus_Education Автор вопроса
    До это примерно так и написал, но или 6069f14477530594853892.png
    или
    post.ID undefined (type []Post has no field or method ID)
    В зависимости от var post []Post