2016-02-27 1 views
0

J'ai commencé à jouer avec gorm aujourd'hui, mais je suis tombé sur une erreur idiote et je suis coincé dessus pendant un moment. Au début, je suis sur Windows et exécutez MySQL 5 (5.0.51b) et la dernière version de go. Je suis allé chercher le pilote gorm et mysql et il compile sans erreur et est capable de se connecter (probablement), mais chaque fois que j'essaye de créer une table basée sur le type déclaré, il renvoie une erreur qui n'est pas informative (car l'erreur est jeté par MySQL). Voici mon code:Erreur lors de la tentative de création de tables à partir du modèle

mport (
    "fmt" 
    _ "github.com/go-sql-driver/mysql" 
    "github.com/jinzhu/gorm" 
) 

type User struct { 
    id int 
} 

func main() { 
    db, err := gorm.Open("mysql", "root:[email protected]/shop?charset=utf8&parseTime=True&loc=Local") 
    fmt.Println(err) 

    a := db.Set("gorm:table_options", "ENGINE=InnoDB").CreateTable(&User{}) 

    fmt.Println(a) 
} 

Ainsi, le modèle est destiné à être très basique, par ex. une table avec une colonne. Maintenant vient la sortie:

< nil > &{0x111e2230 Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ENGINE=InnoDB' at line 1 0 0x112d4060 0x112d4000 0x112d8140 0 {0x112a3f20} false map[gorm:table_options:ENGINE=InnoDB] map[]}

La première est une erreur de connexion qui signifie qu'il est capable de se connecter, mais avec la requête, il est pas bon et l'erreur ne dit presque rien d'autre que SQL généré par Gorm échoue pour une raison quelconque. Donc, la question est de savoir si quelqu'un a une idée de la raison pour laquelle l'erreur est levée et s'il y a une solution.

Répondre

0

Cette erreur se produit lorsque vous essayez de créer une table vide, par exemple:

create table User() ENGINE=InnoDB 

gorm génère une instruction de table vide parce que le champ id de la struct L'utilisateur est privé.

Remplacez id int par ID int. Capitalising la première lettre d'un champ struct l'expose à des packages externes.


comme une question secondaire, au lieu d'imprimer simplement l'erreur:

db, err := gorm.Open(... 
fmt.Println(err) 

c'est une bonne idée de vérifier toutes les erreurs possibles, et les traiter immédiatement:

db, err := gorm.Open(... 
if err != nil { 
    log.Fatal(err) 
} 

Pour d'autres erreurs, gorm's error handling est un peu inhabituel par rapport à la plupart des go code. Vous voudrez probablement vérifier fréquemment les erreurs en utilisant db.GetErrors().

+0

Un grand merci pour votre réponse! Je ne savais pas à propos de cette lettre majuscule. – Gonzalez