¿Cómo establezco una relación con un valor sin clase en SQLAlchemy?

Estoy usando SQLAlchemy en Flask. Tengo una tabla que representa un modo en el que puede estar mi sistema. También tengo una tabla que contiene listas de elevaciones que se aplican a cada modo. (Así que esta es una relación de muchos a muchos). En el pasado, cuando añadía un atributo (como elevations dentro ScanModes aquí) a una clase asignada a una tabla, el objetivo también era una clase.

¿Tiene más sentido envolver las elevaciones en una clase (y hacer una tabla correspondiente?) para poder usar relationship para hacer ScanModes.elevations trabajo, o debo usar un propiedad habilitada para consultas? También estoy abierto a otras sugerencias.

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

preguntado el 12 de junio de 12 a las 19:06

1 Respuestas

el enfoque más directo sería simplemente mapear elevacion_modo_tabla a una clase:

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

mapper(ElevationMode, elevation_mode_table)

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

por supuesto, aún más fácil es hacer que ElevationMode sea una clase declarada en primer lugar, si necesita lidiar con elevation_mode_table, obtendrá eso de ElevationMode.__table__ ...

La idea de "propiedad habilitada para consultas" aquí, seguro que también podría hacer eso, aunque perdería los beneficios de almacenamiento en caché de la relación.

Respondido el 12 de junio de 12 a las 23:06

Gracias. Probaré esto por la mañana. ¡Realmente aprecio que vengas al sitio y brindes apoyo a las personas con la biblioteca! - jim hunziker

Creo que esto no es exactamente lo que estaba buscando; tal vez lo que quiero no es lo suficientemente "SQLAlchemic". estaba imaginando que el elevations atributo podría ser simplemente una lista sin encapsular de valores que se extrajeron del elevation_mode_table. Supongo que el almacenamiento en caché se realiza dentro del ElevationMode objeto aquí, y por eso es necesario? - jim hunziker

En este momento, puedo lograr el almacenamiento en caché y mi atributo como una lista con su código (con elevations renombrado a _elevations) además de hacer elevations ser una propiedad cuyo captador devuelve una lista extraída de la _elevations atributo. - jim hunziker

Si está buscando que las "elevaciones" sean una lista de flotadores, puede presionarlo con el proxy de asociación: consulte docs.sqlalchemy.org/en/rel_0_7/orm/extensions/… - zzzeek

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.