L'éditeur PHP Zimo peut rencontrer une erreur courante lors du développement à l'aide du langage Go : "Erreur Go : time.Time n'implémente pas driver.Valuer (la valeur de la méthode est manquante)". Cette erreur se produit généralement lors du stockage de valeurs de type time.Time dans la base de données. Cela montre que le type time.Time n’implémente pas l’interface driver.Valuer et qu’il manque la méthode Value. Il existe de nombreuses façons de résoudre ce problème. Nous pouvons personnaliser un nouveau type d'heure ou utiliser une bibliothèque tierce pour gérer le stockage des types d'heure. Dans cet article, nous présenterons en détail la cause et la solution de cette erreur pour aider les développeurs à mieux comprendre et résoudre ce problème.
Je travaille sur un projet Go dans lequel j'utilise sqlboiler pour générer du code à partir d'une base de données SQLite3 que j'ai créée à l'aide d'un script setup.sh. J'ai rencontré une erreur que je n'arrive pas à résoudre. Le message d'erreur est :
graph/db/repositories.go:998:23: cannot use o.CreatedAt (variable of type string) as driver.Valuer value in argument to queries.MustTime: string does not implement driver.Valuer (missing method Value) graph/db/repositories.go:999:23: cannot use &o.CreatedAt (value of type *string) as sql.Scanner value in argument to queries.SetScanner: *string does not implement sql.Scanner (missing method Scan)
Cette erreur se produit lorsque j'essaie d'utiliser la valeur time.Time dans le fichier graph/db/repositories.go. J'utilise l'image Docker golang:1.21-alpine3.18 pour mon projet.
J'ai essayé de changer le type de colonne create_at dans la table du référentiel de la base de données SQLite3. Je l'ai testé en utilisant les types de données TEXT et TIMESTAMP mais l'erreur persiste.
Est-ce que quelqu'un sait ce qui pourrait causer cette erreur et comment y remédier ?
dépôts.go
func (o *Repository) Insert(ctx context.Context, exec boil.ContextExecutor, columns boil.Columns) error { if o == nil { return errors.New("db: no repositories provided for insertion") } var err error if !boil.TimestampsAreSkipped(ctx) { currTime := time.Now().In(boil.GetLocation()) if queries.MustTime(o.CreatedAt).IsZero() { queries.SetScanner(&o.CreatedAt, currTime) } } if err := o.doBeforeInsertHooks(ctx, exec); err != nil { return err } nzDefaults := queries.NonZeroDefaultSet(repositoryColumnsWithDefault, o) key := makeCacheKey(columns, nzDefaults) repositoryInsertCacheMut.RLock() cache, cached := repositoryInsertCache[key] repositoryInsertCacheMut.RUnlock()
setup.sh
#!/usr/local/bin/sh set -eu readonly DBFILE_NAME="mygraphql.db" # Create DB file if [ ! -e ${DBFILE_NAME} ];then echo ".open ${DBFILE_NAME}" | sqlite3 fi # Create DB Tables echo "creating tables..." sqlite3 ${DBFILE_NAME} " PRAGMA foreign_keys = ON; CREATE TABLE IF NOT EXISTS users(\ id TEXT PRIMARY KEY NOT NULL,\ name TEXT NOT NULL,\ project_v2 TEXT\ ); CREATE TABLE IF NOT EXISTS repositories(\ id TEXT PRIMARY KEY NOT NULL,\ owner TEXT NOT NULL,\ name TEXT NOT NULL,\ created_at TEXT NOT NULL DEFAULT (DATETIME('now','localtime')),\ FOREIGN KEY (owner) REFERENCES users(id)\ ); CREATE TABLE IF NOT EXISTS issues(\ id TEXT PRIMARY KEY NOT NULL,\ url TEXT NOT NULL,\ title TEXT NOT NULL,\ closed INTEGER NOT NULL DEFAULT 0,\ number INTEGER NOT NULL,\ repository TEXT NOT NULL,\ CHECK (closed IN (0, 1)),\ FOREIGN KEY (repository) REFERENCES repositories(id)\ ); CREATE TABLE IF NOT EXISTS projects(\ id TEXT PRIMARY KEY NOT NULL,\ title TEXT NOT NULL,\ url TEXT NOT NULL,\ owner TEXT NOT NULL,\ FOREIGN KEY (owner) REFERENCES users(id)\ ); CREATE TABLE IF NOT EXISTS pullrequests(\ id TEXT PRIMARY KEY NOT NULL,\ base_ref_name TEXT NOT NULL,\ closed INTEGER NOT NULL DEFAULT 0,\ head_ref_name TEXT NOT NULL,\ url TEXT NOT NULL,\ number INTEGER NOT NULL,\ repository TEXT NOT NULL,\ CHECK (closed IN (0, 1)),\ FOREIGN KEY (repository) REFERENCES repositories(id)\ ); CREATE TABLE IF NOT EXISTS projectcards(\ id TEXT PRIMARY KEY NOT NULL,\ project TEXT NOT NULL,\ issue TEXT,\ pullrequest TEXT,\ FOREIGN KEY (project) REFERENCES projects(id),\ FOREIGN KEY (issue) REFERENCES issues(id),\ FOREIGN KEY (pullrequest) REFERENCES pullrequests(id),\ CHECK (issue IS NOT NULL OR pullrequest IS NOT NULL)\ ); " # Insert initial data echo "inserting initial data..." sqlite3 ${DBFILE_NAME} " PRAGMA foreign_keys = ON; INSERT INTO users(id, name) VALUES\ ('U_1', 'hsaki') ; INSERT INTO repositories(id, owner, name) VALUES\ ('REPO_1', 'U_1', 'repo1') ; INSERT INTO issues(id, url, title, closed, number, repository) VALUES\ ('ISSUE_1', 'http://example.com/repo1/issue/1', 'First Issue', 1, 1, 'REPO_1'),\ ('ISSUE_2', 'http://example.com/repo1/issue/2', 'Second Issue', 0, 2, 'REPO_1'),\ ('ISSUE_3', 'http://example.com/repo1/issue/3', 'Third Issue', 0, 3, 'REPO_1')\ ; INSERT INTO projects(id, title, url, owner) VALUES\ ('PJ_1', 'My Project', 'http://example.com/project/1', 'U_1')\ ; INSERT INTO pullrequests(id, base_ref_name, closed, head_ref_name, url, number, repository) VALUES\ ('PR_1', 'main', 1, 'feature/kinou1', 'http://example.com/repo1/pr/1', 1, 'REPO_1'),\ ('PR_2', 'main', 0, 'feature/kinou2', 'http://example.com/repo1/pr/2', 2, 'REPO_1')\ ; "
sqlboiler.toml
pkgname="db" output="graph/db" wipe=true add-global-variants=false no-tests=true [sqlite3] dbname = "./mygraphql.db"
Environnement
・ MacBook Pro M1 Pro
Je dirais de mettre à jour la structure du référentiel dans Go pour avoir CreatedAt comme champ time.Time. Lorsque vous attribuez une valeur à CreatedAt, utilisez la valeur time.Time. Par exemple, currTime := time.Now() Faites ressembler votre structure à ceci
type Repository struct { ID string `boil:"id" json:"id" toml:"id" yaml:"id"` Owner string `boil:"owner" json:"owner" toml:"owner" yaml:"owner"` Name string `boil:"name" json:"name" toml:"name" yaml:"name"` CreatedAt time.Time `boil:"created_at" json:"created_at" toml:"created_at" yaml:"created_at"` // other fields... }
Puis définissez la valeur CreatedAt :
repository := &Repository{ ID: "some-id", Owner: "owner-id", Name: "repo-name", CreatedAt: time.Now(), // setting it as time.Time }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!