Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Clefs etrangeres avec sqlalchemy pour bdd type Allociné ou Lookiz

+1 vote

Je m' entraine avec la partie orm de sqlalchmy. C'est genial mais y'a tellement de details et de subtilités qu'on s'y perd facilement.
Voici un exercice : on a 3 classes : Film, Actor et Realisator.

Il faut modeliser une bdd pour que l' on puisse choisir un film en fonction des goûts du moment.

Ex : vous aviez vu un bon film coréen de zombis sorti au debuts des années 2000 dont vous avez oublié le nom ?

Vous chercher un film du très proche du "le 6e sens" ayant au moins 4 étoiles sur cinq ?

Vous vous demandez si Ron Perlman a déjà joué avec Rupert Grint ?

Y'a google pour ça, mais il s' agit d'un exercice ...
bref , mon souci actuellement c'est de faire travailler ensemble les clefs etrangeres.
Vous avez compris que la base de données devra pouvoir être abordée sous toutes ses coutûres.

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-

    import sqlalchemy 
    from sqlalchemy import Column, String, Integer, ForeignKey

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship

    metadata = sqlalchemy.MetaData()
    Base = declarative_base(metadata=metadata)

    import sqlalchemy.orm as orm


    class Film(Base):
        __tablename__ = 'films'
        id = sqlalchemy.Column('film_id', sqlalchemy.Integer(), primary_key=True)
        filmname = sqlalchemy.Column(sqlalchemy.String())
        genre = sqlalchemy.Column(sqlalchemy.String())
        abstract = sqlalchemy.Column(sqlalchemy.String())
        year = sqlalchemy.Column(sqlalchemy.Integer())
        popularity = sqlalchemy.Column(sqlalchemy.Integer())
        realisatorname = ...
        nationality = ...
        assimilatefilms = sqlalchemy.Column(sqlalchemy.String())    


        def __str__(self):
            return("  {} est un film {} d' origine {} realise par {},  sorti en {} ; RESUME : {} ; Note {} ;  Vous aimerez aussi :  {} ".format(self.filmname, self.genre, NATIONALITY, REALISATORNAME,  self.year, self.abstract, self.popularity, self.assimilatefilms))


    class Actor(Base):
        __tablename__ = 'acteurs'
        id = sqlalchemy.Column('actor_id', sqlalchemy.Integer(), primary_key=True)
        actorname = sqlalchemy.Column(sqlalchemy.String())
        birthday = sqlalchemy.Column(sqlalchemy.Integer())
        filmography = ...


    class Realisator(Base):
        __tablename__ = 'realisateurs'
        id = sqlalchemy.Column('realisator_id', sqlalchemy.Integer(), primary_key=True)
        realisatorname = sqlalchemy.Column(sqlalchemy.String())
        nationality = sqlalchemy.Column(sqlalchemy.String())
        realisations = ...

engine = sqlalchemy.create_engine('sqlite:///x.sqlite')
metadata.create_all(engine)
s = sqlalchemy.orm.Session(engine)

J'ai mis des majuscules et des petits points pour les corrections.
je sais qu'il faut rajouter des morceaux ressemblant un peu à ça :

realisator_id = sqlalchemy.Column(sqlalchemy.Integer(), 
                         sqlalchemy.ForeignKey('realisator.realisator_id'))

realisator_id = relationship('Realisator', foreign_keys='Film.realisator_id')

films = sqlalchemy.orm.relationship('Film', backref='realisateurs', lazy='dynamic')

Cela pourrait faire un TP / mini tuto sympa pour indexerrorcoders, si y'a quelqu'un que ça interesse...

demandé 4-Nov-2016 par buffalo974 (2,690 points)
edité 4-Nov-2016 par buffalo974

un article sur les fabriques appliquées à sqlalchemy, je ne sais pas si cela sera utile dans ce type d' exercice :

https://www.rcomman.de/les-tests-avec-factory_boy.html

Pour les débutants, un exemple inspiré sur le cours POO de Sam

class Arme(Base):

    __tablename__ = 'armes'
    id = Column(Integer, primary_key=True)
    nom = Column(String)
    degat = Column(Integer)
    univers = Column(String)

    def __init__(self, nom, degat, univers):

        self.nom = nom
        self.degat = degat
        self.univers = univers

    def __str__(self):
        return("{} tape {} de degats max".format(self.nom, self.degat))

    def attaque(self, cible):


        if cible.protection:
            degat = cible.protection.defend(self.degat)
            print("{} - {} = {}".format(cible.vie, degat, cible.vie - degat)) 
            cible.vie -= degat
        else:
            print("{} - {} = {}".format(cible.vie, self.degat, cible.vie - self.degat)) 
            cible.vie -= self.degat

C est cool mais je ne vois pas où tu veux en venir, en fait c est une proposition de tuto pour apprendre sqlalchemy c est ça ?

Ou tu demande comment fonctionnent les clefs étrangères?

ben en priorité c'est la syntaxe pour pouvoir rapidement obtenir toutes les infos sur un film et un peu comme pour de l' hypertexte, zoomer ensuite sur un acteur ou son realisateur puis rebondir à l' envie sur d'autres films.

C'est vraiment utile de savoir créer et utiliser une base de données, l' orm
de sqlalchemy est bien dans l' esprit python.

Une fois cet exemple devenu fonctionnel, cela meriterait sa place dans le depot indexErrorCoders. Y' a beaucoup d'apprentis qui se rejouiront le moment venu.

Votre réponse

Preview

Votre nom à afficher ( en option ):
Vie privée: . Votre adresse de messagerie ne sera utilisée que pour l'envoi de ces notifications .
Vérification anti -spam:
Pour éviter cette vérification à l'avenir, Connectez vous ou inscrivez vous.
...