Golang SQL-Fehler beim Versuch, einen neuen Benutzer zu erstellen
php-Editor Xiaoxin ist beim Erstellen eines neuen Benutzers mit Golang auf einen SQL-Fehler gestoßen. Dieser Fehler kann dazu führen, dass sich Benutzer nicht erfolgreich registrieren und der normale Betrieb der Website beeinträchtigt wird. Für dieses Problem müssen wir die Fehlerursache analysieren und eine Lösung finden. In diesem Artikel werden mehrere häufige Ursachen vorgestellt, die zu Golang-SQL-Fehlern führen können, und entsprechende Lösungen bereitgestellt, um Entwicklern dabei zu helfen, dieses Problem schnell zu lösen und den normalen Betrieb der Website sicherzustellen.
Frageninhalt
Ich habe diesen Fehler erhalten, als ich das Golang-Paket verwendet habe viper
和 cobra
创建用户时,我在 new_user.go
. Der Fehler ist wie folgt:
cannot use result (variable of type sql.result) as error value in return statement: sql.result does not implement error (missing method error)
Mein Code ist in zwei Dateien aufgeteilt, die miteinander kommunizieren. Hier ist die Baumhierarchie:
. ├── makefile ├── readme.md ├── cli │ ├── config.go │ ├── db-creds.yaml │ ├── go.mod │ ├── go.sum │ ├── new_user.go │ └── root.go ├── docker-compose.yaml ├── go.work └── main.go
Um eine Verbindung zur Datenbank herzustellen, habe ich eine Yaml-Datei db-creds.yaml
来提取 config.go
mit den Anmeldeinformationen erstellt. Keine Popup-Fehler hier:
config.go
Dateien
package cli import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" "github.com/spf13/viper" ) // var dialects = map[string]gorp.dialect{ // "postgres": gorp.postgresdialect{}, // "mysql": gorp.mysqldialect{engine: "innodb", encoding: "utf8"}, // } // initconfig reads in config file and env variables if set func initconfig() { if cfgfile != "" { viper.setconfigfile(cfgfile) } else { viper.addconfigpath("./") viper.setconfigname("db-creds") viper.setconfigtype("yaml") } // if a config file is found, read it in: err := viper.readinconfig() if err == nil { fmt.println("fatal error config file: ", viper.configfileused()) } return } func getconnection() *sql.db { // make sure we only accept dialects that were compiled in. // dialect := viper.getstring("database.dialect") // _, exists := dialects[dialect] // if !exists { // return nil, "", fmt.errorf("unsupported dialect: %s", dialect) // } // will want to create another command that will use a mapping // to connect to a preset db in the yaml file. dsn := fmt.sprintf("%s:%s@%s(%s)?parsetime=true", viper.getstring("mysql-5.7-dev.user"), viper.getstring("mysql-5.7-dev.password"), viper.getstring("mysql-5.7-dev.protocol"), viper.getstring("mysql-5.7-dev.address"), ) viper.set("database.datasource", dsn) db, err := sql.open("msyql", viper.getstring("database.datasource")) if err != nil { fmt.errorf("cannot connect to database: %s", err) } return db }
Der Fehler, den ich oben eingefügt habe, ist, wenn ich zurückkehre result
时出现的错误。我正在为 cobra
实现 flag
选项,以使用 -n
后跟 name
, um anzuzeigen, dass der neue Benutzer hinzugefügt wird.
new_user.go
Dateien
package cli import ( "log" "github.com/sethvargo/go-password/password" "github.com/spf13/cobra" ) var name string // newCmd represents the new command var newCmd = &cobra.Command{ Use: "new", Short: "Create a new a user which will accommodate the individuals user name", Long: `Create a new a user that will randomize a password to the specified user`, RunE: func(cmd *cobra.Command, args []string) error { db := getConnection() superSecretPassword, err := password.Generate(64, 10, 10, false, false) result, err := db.Exec("CREATE USER" + name + "'@'%'" + "IDENTIFIED BY" + superSecretPassword) if err != nil { log.Fatal(err) } // Will output the secret password combined with the user. log.Printf(superSecretPassword) return result <---- Error is here }, } func init() { rootCmd.AddCommand(newCmd) newCmd.Flags().StringVarP(&name, "name", "n", "", "The name of user to be added") _ = newCmd.MarkFlagRequired("name") }
Der Hauptzweck dieses Projekts ist dreifach: 1.) Einen neuen Benutzer erstellen, 2.) Erteilen Sie jedem Benutzer bestimmte Berechtigungen 3.) Löschen Sie sie. Das ist mein oberstes Ziel. Als ich Schritt für Schritt vorging, stieß ich auf diesen Fehler. Ich hoffe, jemand kann mir helfen. Ich bin neu bei Golang und habe vor etwa zwei Wochen damit begonnen, es zu verwenden.
Workaround
go gibt Ihnen einen sehr klaren Hinweis darauf, was vor sich geht. Das rune
-Mitglied von cobra erwartet, dass sein Rückruf einen Fehler (oder Null, wenn erfolgreich) zurückgibt.
Hier geben Sie das Ergebnis zurück, bei dem es sich nicht um einen Fehler handelt, sondern um den spezifischen Typ, der von der SQL-Abfrage zurückgegeben wird. So sollte Ihre Funktion aussehen.
RunE: func(cmd *cobra.Command, args []string) error { db := getConnection() superSecretPassword, err := password.Generate(64, 10, 10, false, false) _, err := db.Exec("CREATE USER" + name + "'@'%'" + "IDENTIFIED BY" + superSecretPassword) if err != nil { // Don't Fatal uselessly, let cobra handle your error the way it // was designed to do it. return err } // Will output the secret password combined with the user. log.Printf(superSecretPassword) // Here is how you should indicate your callback terminated successfully. // Error is an interface, so it accepts nil values. return nil }
Wenn Sie das Ergebnis des Befehls db.exec
benötigen (was nicht der Fall zu sein scheint), müssen Sie alle erforderlichen Verarbeitungen im Cobra-Callback durchführen, da dieser nicht dafür ausgelegt ist, Werte an den Hauptthread zurückzugeben.
Fehlerbehandlung
Einige schlechte Praktiken, die mir in meinem Code bezüglich der Fehlerbehandlung aufgefallen sind:
-
Wenn die Go-Funktion einen Fehler zurückgibt, geraten Sie nicht in Panik und beenden Sie das Programm nicht, wenn etwas Unerwartetes passiert (wie Sie es mit
log.fatal
getan haben). Verwenden Sie stattdessen diese Fehlerrückgabe, um den Fehler an den Hauptthread weiterzugeben und ihn entscheiden zu lassen, was zu tun ist. -
Wenn andererseits etwas schief geht, geben Sie keine Ergebnisse zurück. Wenn dies fehlschlägt, sollte Ihre Funktion
getconnection
in der Lage sein, einen Fehler zurückzugeben:func getconnection() (*sql.db, Fehler)
. Sie sollten diesen Fehler dann in der Funktiongetconnection
函数应该能够返回错误:func getconnection() (*sql.db, error)
。然后,您应该在rune
behandeln, anstatt ihn nur zu protokollieren und normal zu behandeln.
Das obige ist der detaillierte Inhalt vonGolang SQL-Fehler beim Versuch, einen neuen Benutzer zu erstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

In diesem Artikel werden eine Vielzahl von Methoden und Tools eingeführt, um PostgreSQL -Datenbanken im Debian -System zu überwachen, um die Datenbankleistung vollständig zu erfassen. 1. verwenden Sie PostgreSQL, um die Überwachungsansicht zu erstellen. PostgreSQL selbst bietet mehrere Ansichten für die Überwachung von Datenbankaktivitäten: PG_STAT_ACTIVITY: Zeigt Datenbankaktivitäten in Echtzeit an, einschließlich Verbindungen, Abfragen, Transaktionen und anderen Informationen. PG_STAT_REPLIKATION: Monitore Replikationsstatus, insbesondere für Stream -Replikationscluster. PG_STAT_DATABASE: Bietet Datenbankstatistiken wie Datenbankgröße, Transaktionsausschüsse/Rollback -Zeiten und andere Schlüsselindikatoren. 2. Verwenden Sie das Log -Analyse -Tool PGBADG

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...

Der Unterschied zwischen Stringdruck in GO -Sprache: Der Unterschied in der Wirkung der Verwendung von Println und String () ist in Go ...

Das Problem der Verwendung von RETISTREAM zur Implementierung von Nachrichtenwarteschlangen in der GO -Sprache besteht darin, die Go -Sprache und Redis zu verwenden ...

Wie kann man im Beegoorm -Framework die mit dem Modell zugeordnete Datenbank angeben? In vielen BeEGO -Projekten müssen mehrere Datenbanken gleichzeitig betrieben werden. Bei Verwendung von BeEGO ...
