2 votes

Comment établir une relation avec une valeur sans classe dans SQLAlchemy ?

J'utilise SQLAlchemy sous Flask. J'ai une table qui représente un mode dans lequel mon système peut se trouver. J'ai également un tableau qui contient des listes d'élévations qui sont applicables à chaque mode. (Il s'agit donc d'une relation many-to-many.) Dans le passé, lorsque j'ai ajouté un attribut (tel que elevations à l'intérieur de ScanModes ici) à une classe mappée à une table, la cible était aussi une classe.

Est-il plus judicieux d'envelopper les élévations dans une classe (et de créer un tableau correspondant ?) afin de pouvoir utiliser la fonction relationship de faire ScanModes.elevations ou dois-je utiliser un propriété "query-enabled ? Je suis également ouvert à toute autre suggestion.

elevation_mode_table = db.Table('elevation_mode', db.metadata,
                                db.Column('scan_mode', db.String,
                                          db.ForeignKey('scan_modes'),
                                          nullable=False),
                                db.Column('elevation', db.Float,
                                          nullable=False),
                                db.PrimaryKeyConstraint('scan_mode', 
                                                        'elevation'))

class ScanModes(db.Model):
    scan_mode = db.Column(db.String, primary_key=True)
    elevations = ?

    def __init__(self, scan_mode):
        self.scan_mode = scan_mode

3voto

zzzeek Points 22617

L'approche la plus simple serait de simplement faire correspondre elevation_mode_table à une classe :

from sqlalchemy.orm import mapper
class ElevationMode(object):
    pass

mapper(ElevationMode, elevation_mode_table)

class ScanModes(db.Model):
    elevations = relationship(ElevationMode)

Bien sûr, il est encore plus facile de faire en sorte que ElevationMode soit une classe déclarée dès le départ. Si vous avez besoin de traiter la table elevation_mode_table, vous l'obtiendrez à l'aide des éléments suivants ElevationMode.__table__ ...

L'idée de la "propriété activée par la requête" ici, bien sûr, vous pourriez faire cela aussi, mais vous perdriez les avantages de la mise en cache de la relation.

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