[python] peewee et clé étrangères

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour,

Afin de progresser en Python, j’essaye d’apprendre à utiliser peewee. J’ai une petite base de données sqlite que j’ai créé à la mano. Voici un schéma de cette dernière :

Personne
    id = clé primaire
    nom
    prenom
    mail

Voiture
    personne_id (clé étrangère qui référence la colonne id de Personne)
    nombre_kilometre
    couleur

Je n’ai donc pas de clé primaire sur la table Voiture. Une personne peut avoir plusieurs voiture mais une voiture ne peut pas appartenir à plusieurs personnes.

J’aimerai retranscrire ce modèle avec peewee. J’arrive à sélectionner ce que je veux dans la table Personne, mais j’ai un problème lorsque je tape sur la table Voiture. Voici ma déclaration de classe qui sont supposé représenter ma base de données

class BaseModel(peewee.Model):
    class Meta:
        db_path="base_de_donnees.db"
        database = peewee.SqliteDatabase(db_path, pragmas={'foreign_keys': 1})

class Personne(BaseModel):
    id = peewee.IntegerField(primary_key=True)
    nom = peewee.CharField()
    prenom = peewee.CharField()
    mail = peewee.CharField()

class Voiture(BaseModel):
    personne_id = peewee.ForeignKey(Personne)
    nombre_kilometre = peewee.IntegerField()
    couleur = peewee.CharField()

Ensuite, je veux sélectionner tout les infos sur les voitures qui ont un personne_id égal à 5 (maximum 10 résultats), je fais donc.

result = Voiture.select().where(Voiture.personne_id==5).limit(10)

Si je fais un

print result.count()

ça me retourne bien 10 (au vue des données dans ma base c’est logique). Par contre, si je tente d’afficher les résultats avec la boucle :

for element in result:
   print result

Je me prends cette erreur : OperationalError: no such column: t1.id

J’ai essayé de regarder d’autre bout de code sur internet mais impossible de résoudre mon problème. Je pense que le problème viens du fait que j’ai mal déclarer la clé étrangère de la table Voiture.

Est ce que quelqu’un pourrait m’aider à comprendre d’où viens le problème, et surtout me donner une piste pour essayer de le corriger.

Merci d’avance :)

+0 -0

Salut,

Tu dois toujours avoir une colonne qui te permet d’identifier les entrées dans une table, la primary key. Il te manque cette colonne dans ta table Voiture.

Aussi, tu n’as pas besoin de créer ta table à la main, peewee a une méthode pour générer les tables associés à des modèles : regarde du côté de .create_tables().

Auteur du sujet

Merci pour ton aide.

Pour le fait de toujours devoir avoir une clé primaire sur une table, tu es en sur ? Parce que en créant ma table à la main, je n’ai aucune erreur si je ne spécifie pas de clé primaire pour ma table Voiture (sqlite ne nous oblige pas à ajouter de clé primaire, du coup c’est peewee qui demande forcément à ce qu’il y ait une clé primaire sur toutes les tables ?).

Pour ce qui est de la création de la table, je suis d’accord que je pourrais la créer avec peewee, mais le problème c’est que j’ai déjà crée ma base (et surtout elle est déjà remplie, avec beaucoup beaucoup de données). Je voudrais donc me servir de peewee juste pour faire de la selection sur ma base

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte