¿Cómo establezco una relación con un valor sin clase en SQLAlchemy?
Frecuentes
Visto 66 veces
2
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
1 Respuestas
3
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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas python sqlalchemy flask-sqlalchemy or haz tu propia pregunta.
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 delelevation_mode_table
. Supongo que el almacenamiento en caché se realiza dentro delElevationMode
objeto aquí, y por eso es necesario? - jim hunzikerEn 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 hacerelevations
ser una propiedad cuyo captador devuelve una lista extraída de la_elevations
atributo. - jim hunzikerSi 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