Comment .Scan() MySQL valeur d'HORODATAGE en temps.Variable de temps?
J'ai ce Go code:
package main
import (
"fmt"
"database/sql"
_"github.com/go-sql-driver/mysql"
"time"
)
type User struct {
id uint32
name string
email string
rating uint8
subscription uint8
date_registered time.Time
online string
}
//main entry point
func main() {
//setup db connection
db, err := sql.Open("mysql", "user:@tcp(127.0.0.1:3306)/c9?parseTime=true")
if err != nil {
fmt.Println(err)
}
defer db.Close()
//query
rows, err := db.Query("SELECT * FROM users WHERE id = ?", 1)
if err != nil {
fmt.Println(err)
}
defer rows.Close()
usr := User{}
for rows.Next() {
err := rows.Scan(&usr.id, &usr.name, &usr.email, &usr.rating, &usr.subscription, &usr.date_registered, &usr.online)
if err != nil {
fmt.Println(err)
}
}
fmt.Println(usr)
err = rows.Err()
if err != nil {
fmt.Println(err)
}
}
C'est ce que je reçois de console MySQL:
mysql> describe users;
+-----------------+---------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------------+------+-----+-------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(50) | NO | | NULL | |
| email | varchar(50) | NO | | NULL | |
| rating | tinyint(3) unsigned | YES | | NULL | |
| subscription | tinyint(3) unsigned | NO | | 0 | |
| date_registered | timestamp | NO | | CURRENT_TIMESTAMP | |
| online | char(1) | NO | | N | |
+-----------------+---------------------+------+-----+-------------------+----------------+
7 rows in set (0.00 sec)
mysql> SELECT * FROM users;
+----+------------+-----------------------+--------+--------------+---------------------+--------+
| id | name | email | rating | subscription | date_registered | online |
+----+------------+-----------------------+--------+--------------+---------------------+--------+
| 1 | alakhazamm | abcdefghhhh@gmail.com | NULL | 0 | 2014-10-28 15:37:44 | N |
+----+------------+-----------------------+--------+--------------+---------------------+--------+
1 row in set (0.00 sec)
Après .Scan()
, fmt.Println(usr)
imprime
{1 alakhazamm abcdefghhhh@gmail.com 0 0 {0 0 <nil>} }
Les deux derniers champs de la structure sont mauvais, mais je n'ai aucune idée pourquoi.
J'ai essayé d'utiliser date_registered string
dans la structure de la définition, mais je reçois une chaîne vide après .Scan()
.
J'ai aussi lu dans le pilote de docs que ?parseTime=true
analyse MySQL DATE et DATETIME valeurs dans le temps.Temps, mais ils ne parlent pas de TIMESTAMP qui est ce que je suis en train d'utiliser.
Ai-je raté quelque chose d'important ou est-ce un bug/fonctionnalité manquante de la bibliothèque?
OriginalL'auteur Carlo Vespa | 2014-10-28
Vous devez vous connecter pour publier un commentaire.
Je sais que c'est une vieille question, cependant j'ai été absent de ce paramètre dans mon appel:
Voir ici
OriginalL'auteur incognick
J'ai trouvé la cause de l'erreur.
Depuis
rating
est NULL dans la base de données, le scanner a donné l'erreurJ'ai mis à jour la base de données en ligne et maintenant
usr.date_registered
etusr.online
tenir les valeurs correctes.Je suppose que je vais devoir faire le MySQL champ NON NUL, et juste utiliser -1 pour indiquer une non-initialisées à la valeur.
Il a travaillé, merci!
Nous avons donc beaucoup de temps de timbres dans notre code qui peut être nulle, que nous nous sommes retrouvés juste l'ajout d'une simple NullTime classe qui est modélisé de la même manière que les autres DB null classes.
OriginalL'auteur Carlo Vespa