GORM在Golang中创建不起作用,出现了一个MariaDB错误。

huangapple go评论125阅读模式
英文:

GORM golang create does not work, getting an mariadb error

问题

我正在尝试将Mariadb集成到我的待办事项应用程序中,因为我正在学习Go语言。我决定使用gorm。我遇到的错误是:

  1. 2022/10/16 21:47:49 C:/Users/xxx/go/src/go-todo-app/server/main.go:44 Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'RETURNING `id`,`id`' at line 1
  2. [0.000ms] [rows:0] INSERT INTO `todos` (`created_at`,`updated_at`,`deleted_at`,`title`,`done`,`body`) VALUES ('2022-10-16 21:47:49.1','2022-10-16 21:47:49.1',NULL,'Testing',0,'Finish Tutorial') RETURNING `id`,`id`

对于我的HTTP服务器,我正在使用gofiber v2。

  1. app.Post("/api/todos", func(c *fiber.Ctx) error {
  2. todo := &Todo{}
  3. if err := c.BodyParser(todo); err != nil {
  4. return err
  5. }
  6. newTodo := &Todo{
  7. Title: todo.Title,
  8. Body: todo.Body,
  9. Done: 0,
  10. }
  11. db.Create(&newTodo) // 在这里失败
  12. var todos []Todo
  13. db.Find(&todos)
  14. return c.JSON(todos)
  15. })

我的Todo结构如下所示:

  1. type Todo struct {
  2. gorm.Model
  3. ID int `json:"id"`
  4. Title string `json:"title"`
  5. Done int `json:"done"`
  6. Body string `json:"body"`
  7. }
英文:

I'm trying to implement mariadb integration to my todo app, as I'm learning go. I decided to use gorm. The error I'm getting is

  1. 2022/10/16 21:47:49 C:/Users/xxx/go/src/go-todo-app/server/main.go:44 Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'RETURNING `id`,`id`' at line 1
  2. [0.000ms] [rows:0] INSERT INTO `todos` (`created_at`,`updated_at`,`deleted_at`,`title`,`done`,`body`) VALUES ('2022-10-16 21:47:49.1','2022-10-16 21:47:49.1',NULL,'Testing',0,'Finish Tutorial') RETURNING `id`,`id`

For my http server im using gofiber v2.

  1. app.Post("/api/todos", func(c *fiber.Ctx) error {
  2. todo := &Todo{}
  3. if err := c.BodyParser(todo); err != nil {
  4. return err
  5. }
  6. newTodo := &Todo{
  7. Title: todo.Title,
  8. Body: todo.Body,
  9. Done: 0,
  10. }
  11. db.Create(&newTodo) // fails here
  12. var todos []Todo
  13. db.Find(&todos)
  14. return c.JSON(todos)
  15. })

and my Todo struct looks like this:

  1. type Todo struct {
  2. gorm.Model
  3. ID int `json:"id"`
  4. Title string `json:"title"`
  5. Done int `json:"done"`
  6. Body string `json:"body"`
  7. }

答案1

得分: 3

在您的旧MariaDB版本中明确禁用返回将防止语法错误:

gorm.Open(mysql.New(mysql.Config{Conn: conn, DisableWithReturning: true}))

gorm mysql驱动程序不应该在没有版本检查的情况下启用WithReturning。这是一个应该报告给hem的错误。

英文:

Explicitly disabling the returning in your older MariaDB version will prevent the syntax error:

  1. gorm.Open(mysql.New(mysql.Config{Conn: conn, DisableWithReturning: true}))

The gorm mysql driver shouldn't be enabling WithReturning without a version check. This is a bug that should be reported to hem.

答案2

得分: -1

问题已解决。
问题出在我在Windows上使用Xampp安装了MariaDb(PHP 7.4)。在那个版本中,MariaDb不支持RETURNING语句。我按照这个指南安装了MySQL 5.7,代替了MariaDb。https://stackoverflow.com/questions/39654428/how-can-i-change-mariadb-to-mysql-in-xampp

英文:

Problem resolved.
The issue was that I had MariaDb installed with Xampp for windows (PHP 7.4). In that version, RETURNING statement is not available for MariaDb. I followed this guide to install MySQL 5.7 instead of MariaDb. https://stackoverflow.com/questions/39654428/how-can-i-change-mariadb-to-mysql-in-xampp

huangapple
  • 本文由 发表于 2022年10月17日 03:50:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/74090279.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定