3 votes

Enum donnant une erreur avec Vapor 4 et fluent

Cela me laisse perplexe :

J'ai un modèle dans lequel je veux utiliser une énumération. Je déclare d'abord l'énumération :

enum MenuChoices: String, Codable {
    case reachableAt
    case attentionTo
    case reasonVisit
    case reasonProblem
}

Ensuite, il est dans mes champs de la classe :

@Enum(key: "menu_choices")
var menuChoices: MenuChoices

Ensuite je le crée dans la base de données en utilisant une migration :

struct CreateUserMenu: Migration {    
func prepare(on database: Database) -> EventLoopFuture {
    return database.enum("menu_choices")
        .case("reachable_at")
        .case("attention_to")
        .case("reason_visit")
        .case("reason_problem")
        .create()
        .flatMap { menu_choices in
            return database.schema("user_menus")
                .id()
                .field("created_at", .datetime, .required)
                .field("updated_at",.datetime, .required)
                .field("deleted_at",.datetime)
                .field("menu_choices", menu_choices)
                .field("be_nl", .string)
                .field("be_fr", .string)
                .field("en_us", .string)
                .create()
        }
    }
}

Jusque-là tout va bien. Cette migration fonctionne et la base de données semble correcte. Mais lorsque je veux ajouter des données pour alimenter la base de données dans une autre migration, j'obtiens une erreur :

let test = UserMenu( menuChoices: MenuChoices.reachableAt, beNl: "nl", beFr: "fra", enUs: "eng")
let _ = test.save(on: database)

+ App.addUserMenus on default
Would you like to continue?
y/n> y
[ ERROR ] previousError(MySQL error: Server error: Data truncated for column 'menu_choices' at row 1)
Fatal error: Error raised at top level: previousError(MySQL error: Server error: Data truncated for column 'menu_choices' at row 1): file /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-1103.8.25.8/swift/stdlib/public/core/ErrorType.swift, line 200
    USSS-Voyager-II:24yours data$ 

Malheureusement, cette erreur ne permet pas vraiment de localiser la source du problème

3voto

Nick Points 1857

Le problème est qu'il n'y a pas de correspondance entre la définition enum swift et l'enum Fluent. Mettre une valeur littérale de chaîne pour la définition de votre enum swift qui corresponde à la valeur littérale de la Fluent corrigera le problème.

enum MenuChoices: String, Codable {
    case reachableAt = "reachable_at"
    case attentionTo = "attention_to"
    case reasonVisit = "reason_visit"
    case reasonProblem = "reason_problem"
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X