Тупик на POST-запросе Webservice с использованием gin-go gorm
Я захожу в тупик, когда запускаю тесты по запросу POST.
Я предполагаю, что Горм замедляет мой запрос, используя переходы. журнал показывает:
(Ошибка 1213: обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию)
[2018-08-21 18:00:09]
(Ошибка 1213: обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию)
[2018-08-21 18:00:09]
(Ошибка 1213: обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию)
[2018-08-21 18:00:09]
(Ошибка 1213: обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию)
[2018-08-21 18:00:09]
(Ошибка 1213: обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию)
[2018-08-21 18:00:09]
(Ошибка 1213: обнаружена тупиковая ситуация при попытке получить блокировку; попробуйте перезапустить транзакцию)
[2018-08-21 18:00:09]
[GIN] 2018/08/21 - 18:00:09 | 200 | 6.938488185с | 192.168.10.39 | POST / т / пост
[GIN] 2018/08/21 - 18:00:09 | 500 | 8.471536241s | 192.168.10.39 | POST / т / пост
[GIN] 2018/08/21 - 18:00:09 | 500 | 5.897599896s | 192.168.10.39 | POST / т / пост
[GIN] 2018/08/21 - 18:00:09 | 500 | 6.947142107s | 192.168.10.39 | POST / т / пост
[GIN] 2018/08/21 - 18:00:09 | 200 | 7.010271289s | 192.168.10.39 | POST / т / пост
[GIN] 2018/08/21 - 18:00:09 | 200 | 7.104230316s | 192.168.10.39 | POST / т / пост
[GIN] 2018/08/21 - 18:00:09 | 200 | 6.400713187s | 192.168.10.39 | POST / т / пост
[GIN] 2018/08/21 - 18:00:09 | 200 | 7.233930237s | 192.168.10.39 | POST / т / пост
вот мой веб-сервис
package main
import (
"net/http"
"sync"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
var db *gorm.DB
var wg sync.WaitGroup
type (
// therapistModel describes a therapistModel type
Therapist struct {
ID int `gorm:"AUTO_INCREMENT"`
// UserId int `json:"user_id"`
Firstname string `gorm:"column:firstname"`
Lastname string `gorm:"column:lastname"`
// ContactId int `json:"contact_id"`
// ProfessionalAddressId int `json:"professional_address_id"`
// Gender int `json:"gender"`
NumId string `json:"num_id"`
// Fin int `json:"fin"`
// ProfessionId int `json:"profession_id"`
// QualificationId int `json:"qualification_id"`
// ProfessionalNumId int `json:"professional_num_id"`
// Image string `json:"image"`
// ProformHeader string `json:"proform_header"`
// ProformFooter string `json:"proform_footer"`
// TermsAndConditions string `json:"terms_and_conditions"`
// CreatedAt *time.Time `json:"created_at"`
// UpdatedAt *time.Time `json:"updated_at"`
Diagnoses []Diagnosis `gorm:"many2many:therapists_diagnoses;"`
}
//diagnosisModel describes a diagnosisModel type
Diagnosis struct {
ID int `json:"id" gorm:"AUTO_INCREMENT"`
InterventionFieldId int `json:"intervention_field_id"`
Diagnosis string `json:"diagnosis"`
StateId int `json:"state_id"`
// permissionId int `json:"permission_id"`
Therapists []*Therapist `gorm:"many2many:therapists_diagnoses;"`
}
)
func InitDb() *gorm.DB {
var err error
db, err := gorm.Open("mysql", "username:password@tcp(10.10.10.200)/testes?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic("failed to connect database")
} else {
return db
}
}
func main () {
router := gin.Default()
therapist := router.Group("/t")
{
therapist.GET("/", fetchAllTherapists)
therapist.GET("/d/:id", fetchTherapistsDiagnoses)
therapist.POST("/post", postTherapistDiagnosis)
}
router.Run(":4000")
}
func fetchAllTherapists(c *gin.Context) {
db := InitDb()
defer db.Close()
c.Header("Content-Type", "application/json")
var therapists []Therapist
if err := db.Find(&therapists).Error; err != nil {
c.AbortWithStatus(404)
} else {
c.JSON(http.StatusOK, therapists)
}
}
func fetchTherapistsDiagnoses(c *gin.Context) {
db := InitDb()
defer db.Close()
id := c.Params.ByName("id")
var diagnoses []Diagnosis
var therapist Therapist
db.Model(&therapist).Related(&diagnoses, "Diagnoses")
if err := db.Preload("Diagnoses").First(&therapist, id).Error; err != nil {
c.AbortWithStatus(404)
} else {
c.JSON(http.StatusOK, therapist.Diagnoses)
}
}
func postTherapistDiagnosis(c *gin.Context) {
db := InitDb()
defer db.Close()
id := c.PostForm("id")
var therapist []*Therapist
if err := db.First(&therapist, id).Error; err != nil{
c.AbortWithStatusJSON(http.StatusNotFound, gin.H{"error": "Therapist not found"})
} else {
var diagnosis = Diagnosis{
InterventionFieldId: 1,
Diagnosis: "JoelTeste",
StateId: 1,
Therapists: therapist}
if err := db.Save(&diagnosis).Error; err != nil {
c.AbortWithStatusJSON(http.StatusInternalServerError, gin.H{"error": "Failed to save Diagnosis"})
} else {
c.JSON(http.StatusOK, diagnosis)
}
}
}