无法通过golang orm库创建关联

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

Unable to create Associations via golang orm library

问题

我一直在尝试使用golang orm中的关联特性(https://github.com/jinzhu/gorm/),但是无法创建一个非常简单的关联。在下面的示例中,用户表包含数据,但是电子邮件表没有数据。我尝试了很多方法,可能是我漏掉了一些基本的东西,但是在github/stackoverflow上找不到正确的答案。

代码:

  1. package main
  2. import (
  3. "database/sql"
  4. "log"
  5. "github.com/jinzhu/gorm"
  6. "github.com/mattn/go-sqlite3"
  7. )
  8. var db gorm.DB
  9. type User struct {
  10. Name string
  11. Mail Email
  12. }
  13. type Email struct {
  14. Address string
  15. }
  16. //初始化数据库
  17. func InitDB() {
  18. var DB_DRIVER string
  19. sql.Register(DB_DRIVER, &sqlite3.SQLiteDriver{})
  20. log.Printf("Initializing Database with ", DB_DRIVER)
  21. dbSql, _ := sql.Open(DB_DRIVER, "simple-sqlite")
  22. var err error
  23. db, err = gorm.Open("sqlite3", dbSql)
  24. if err != nil {
  25. log.Fatalf("Got error when connecting to the database, the error is '%v'", err)
  26. }
  27. db.LogMode(true)
  28. //然后你可以使用`*sql.DB`的函数
  29. db.DB().Ping()
  30. db.DB().SetMaxIdleConns(10)
  31. db.DB().SetMaxOpenConns(100)
  32. //禁用表名的复数形式
  33. db.SingularTable(true)
  34. }
  35. func InitSchema() {
  36. db.CreateTable(&User{}, &Email{})
  37. }
  38. func DoStuff() {
  39. user := User{Name: "Jinzhu", Mail: Email{Address: "hello@hello.com"}}
  40. db.Create(&user)
  41. }
  42. func main() {
  43. InitDB()
  44. InitSchema()
  45. DoStuff()
  46. }

运行go run main.go会输出以下内容:
2015/09/30 17:25:04 Initializing Database with %!(EXTRA string=)

[2015-09-30 17:25:04] [3.21ms] CREATE TABLE "user" ("name" varchar(255))

[2015-09-30 17:25:04] [4.01ms] CREATE TABLE "email" ("address" varchar(255) )

[2015-09-30 17:25:04] [0.54ms] INSERT INTO "user" ("name") VALUES ('Jinzhu')

不确定我漏掉了什么 - 感谢任何回复!

英文:

I've been trying to use the Associations feature in golang orm (https://github.com/jinzhu/gorm/), and am unable to create a pretty simple association.
In the example below, the user table contains data, but email table does not.
I've tried a bunch of things and I'm probably missing something basic, but have been unable to find the right answer in github/stackoverflow.

Code :

  1. package main
  2. import (
  3. "database/sql"
  4. "log"
  5. "github.com/jinzhu/gorm"
  6. "github.com/mattn/go-sqlite3"
  7. )
  8. var db gorm.DB
  9. type User struct {
  10. Name string
  11. Mail Email
  12. }
  13. type Email struct {
  14. Address string
  15. }
  16. //Initialize DB .
  17. func InitDB() {
  18. var DB_DRIVER string
  19. sql.Register(DB_DRIVER, &sqlite3.SQLiteDriver{})
  20. log.Printf("Initializing Database with ", DB_DRIVER)
  21. dbSql, _ := sql.Open(DB_DRIVER, "simple-sqlite")
  22. var err error
  23. db, err = gorm.Open("sqlite3", dbSql)
  24. if err != nil {
  25. log.Fatalf("Got error when connecting to the database, the error is '%v'", err)
  26. }
  27. db.LogMode(true)
  28. // Then you could invoke `*sql.DB`'s functions with it
  29. db.DB().Ping()
  30. db.DB().SetMaxIdleConns(10)
  31. db.DB().SetMaxOpenConns(100)
  32. // Disable table name's pluralization
  33. db.SingularTable(true)
  34. }
  35. func InitSchema() {
  36. db.CreateTable(&User{}, &Email{})
  37. }
  38. func DoStuff() {
  39. user := User{Name: "Jinzhu", Mail: Email{Address: "hello@hello.com"}}
  40. db.Create(&user)
  41. }
  42. func main() {
  43. InitDB()
  44. InitSchema()
  45. DoStuff()
  46. }

go run main.go prints the following output
2015/09/30 17:25:04 Initializing Database with %!(EXTRA string=)

[2015-09-30 17:25:04] [3.21ms] CREATE TABLE "user" ("name" varchar(255))

[2015-09-30 17:25:04] [4.01ms] CREATE TABLE "email" ("address" varchar(255) )

[2015-09-30 17:25:04] [0.54ms] INSERT INTO "user" ("name") VALUES ('Jinzhu')

Not sure what I'm missing here - appreciate any response!

答案1

得分: 1

你的模型中缺少主键和外键引用,以下是更新后的代码:

  1. package main
  2. import (
  3. "database/sql"
  4. "log"
  5. "github.com/jinzhu/gorm"
  6. "github.com/mattn/go-sqlite3"
  7. )
  8. var db gorm.DB
  9. type User struct {
  10. ID uint `gorm:"primary_key"`
  11. Name string
  12. Mail Email
  13. MailID sql.NullInt64
  14. }
  15. type Email struct {
  16. ID uint `gorm:"primary_key"`
  17. Address string
  18. }
  19. // 初始化数据库
  20. func InitDB() {
  21. var DB_DRIVER string
  22. sql.Register(DB_DRIVER, &sqlite3.SQLiteDriver{})
  23. log.Printf("Initializing Database with ", DB_DRIVER)
  24. dbSql, _ := sql.Open(DB_DRIVER, "simple-sqlite")
  25. var err error
  26. db, err = gorm.Open("sqlite3", dbSql)
  27. if err != nil {
  28. log.Fatalf("Got error when connecting to the database, the error is '%v'", err)
  29. }
  30. db.LogMode(true)
  31. // 可以使用 `*sql.DB` 的函数
  32. db.DB().Ping()
  33. db.DB().SetMaxIdleConns(10)
  34. db.DB().SetMaxOpenConns(100)
  35. // 禁用表名的复数形式
  36. db.SingularTable(true)
  37. }
  38. func InitSchema() {
  39. db.CreateTable(&User{}, &Email{})
  40. }
  41. func DoStuff() {
  42. user := User{Name: "Jinzhu", Mail: Email{Address: "hello@hello.com"}}
  43. db.Create(&user)
  44. }
  45. func main() {
  46. InitDB()
  47. InitSchema()
  48. DoStuff()
  49. }
  50. 注意 `User` `Email` 结构体上的主键以及 `User` 上的外键引用
  51. <details>
  52. <summary>英文:</summary>
  53. You&#39;re missing your primary/foreign key references for each of your models, here&#39;s the updated code:
  54. package main
  55. import (
  56. &quot;database/sql&quot;
  57. &quot;log&quot;
  58. &quot;github.com/jinzhu/gorm&quot;
  59. &quot;github.com/mattn/go-sqlite3&quot;
  60. )
  61. var db gorm.DB
  62. type User struct {
  63. ID uint `gorm:&quot;primary_key&quot;`
  64. Name string
  65. Mail Email
  66. MailID sql.NullInt64
  67. }
  68. type Email struct {
  69. ID uint `gorm:&quot;primary_key&quot;`
  70. Address string
  71. }
  72. //Initialize DB .
  73. func InitDB() {
  74. var DB_DRIVER string
  75. sql.Register(DB_DRIVER, &amp;sqlite3.SQLiteDriver{})
  76. log.Printf(&quot;Initializing Database with &quot;, DB_DRIVER)
  77. dbSql, _ := sql.Open(DB_DRIVER, &quot;simple-sqlite&quot;)
  78. var err error
  79. db, err = gorm.Open(&quot;sqlite3&quot;, dbSql)
  80. if err != nil {
  81. log.Fatalf(&quot;Got error when connecting to the database, the error is &#39;%v&#39;&quot;, err)
  82. }
  83. db.LogMode(true)
  84. // Then you could invoke `*sql.DB`&#39;s functions with it
  85. db.DB().Ping()
  86. db.DB().SetMaxIdleConns(10)
  87. db.DB().SetMaxOpenConns(100)
  88. // Disable table name&#39;s pluralization
  89. db.SingularTable(true)
  90. }
  91. func InitSchema() {
  92. db.CreateTable(&amp;User{}, &amp;Email{})
  93. }
  94. func DoStuff() {
  95. user := User{Name: &quot;Jinzhu&quot;, Mail: Email{Address: &quot;hello@hello.com&quot;}}
  96. db.Create(&amp;user)
  97. }
  98. func main() {
  99. InitDB()
  100. InitSchema()
  101. DoStuff()
  102. }
  103. notice the primary keys on the `User` and `Email` structs as well as the foreign key reference on `User`
  104. </details>

huangapple
  • 本文由 发表于 2015年10月1日 08:46:21
  • 转载请务必保留本文链接:https://go.coder-hub.com/32877813.html
匿名

发表评论

匿名网友

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

确定