J'essaie d'écrire un type de données personnalisé Gorm: https://gorm.io/docs/data_types.html
type MyDataType struct {} func (f *MyDataType) Scan(value interface{}) error { // } func (f MyDataType) Value() (driver.Value, error) { // }
Pour certaines raisons, j'ai besoin d'accéder au contexte dans Scan
ou de pouvoir récupérer les balises de champ.
Y a-t-il un moyen de faire cela ? Merci
3 Réponses :
La valeur est basée sur l'espace utilisateur dont vous devrez peut-être changer le code pour qu'il ressemble à:
type MyDataType struct {} func (f *MyDataType) Scan(context context.Context, value interface{}) error { // proceed the context right there } func (f MyDataType) Value() (driver.Value, error) { // }
À quel contexte avez-vous besoin pour accéder?
Scan (...) est utilisé pour traduire les données brutes de la base de données dans votre type de champ personnalisé. Vous devez connaître le format.
Value () est l'inverse, il convertit votre champ personnalisé en ce qui doit être placé dans la base de données.
Vous ne pouvez pas modifier les paramètres de func Scan
ou func Value
car essayer de le faire interrompra l' MyDataType
de sql.Scanner
et sql.Valuer
.
Il peut être fait en intégrant context.Context
à l' intérieur MyDataType
.
type MyDataType struct { context.Context } func (f *MyDataType) Scan(value interface{}) error { ctx := context.Background() ctx = context.WithValue(ctx, "key", value) f.Context = ctx return nil } func (f MyDataType) Value() (driver.Value, error) { value := f.Context.Value("key") return value, nil }