Tengo las siguientes clases mapeadas de SQLAlchemy:
class User(Base):
__tablename__ = 'users'
email = Column(String, primary_key=True)
name = Column(String)
class Document(Base):
__tablename__ = "documents"
name = Column(String, primary_key=True)
author = Column(String, ForeignKey("users.email"))
class DocumentsPermissions(Base):
__tablename__ = "documents_permissions"
readAllowed = Column(Boolean)
writeAllowed = Column(Boolean)
document = Column(String, ForeignKey("documents.name"))
Necesito conseguir una mesa como esta para user.email = "[email protected]":
email | name | document_name | document_readAllowed | document_writeAllowed
¿Cómo se puede hacer usando una solicitud de consulta para SQLAlchemy? El siguiente código no me funciona:
result = session.query(User, Document, DocumentPermission).filter_by(email = "[email protected]").all()
Gracias,
python
sql
join
sqlalchemy
barankin
fuente
fuente

result = session.query(User, Document).select_from(join(User, Document)).filter(User.email=='[email protected]').all()Pero aún no he logrado hacer que funcione de manera similar para tres tablas (para incluir DocumentPermissions). ¿Alguna idea?Respuestas:
Prueba esto
fuente
joinhace? interior, exterior, cruz o qué?[(<user>, <document>, <documentpermissions>),...]/select x from a, b ,cque es una combinación cruzada. Luego, los filtros lo convierten en una combinación interna..all(). Entonces,print Session.query....para ver exactamente qué está haciendo..filter()puedo recibir múltiples criterios si están separados por comas. ¿Es preferible usar uno.filter()con separaciones de comas dentro del paréntesis, o usar múltiples.filter()como la respuesta anterior?Un buen estilo sería configurar algunas relaciones y una clave principal para los permisos (en realidad, generalmente es un buen estilo configurar claves primarias enteras para todo, pero lo que sea):
Luego haz una consulta simple con uniones:
fuente
queryestablece en la última línea y cómo se accede a los registros unidos en ella?Document(segundo valor de tupla) en el conjunto de resultados de la consulta?for (user, doc, perm) in query: print "Document: %s" % docComo dijo @letitbee, su mejor práctica es asignar claves primarias a las tablas y definir correctamente las relaciones para permitir una consulta ORM adecuada. Habiendo dicho eso...
Si está interesado en escribir una consulta como:
Entonces deberías optar por algo como:
Si, en cambio, quieres hacer algo como:
Entonces deberías hacer algo como:
Una nota sobre eso ...
Para obtener más información, visite los documentos .
fuente
Ampliando la respuesta de Abdul, puede obtener una
KeyedTuplecolección de filas en lugar de una discreta uniendo las columnas:fuente
Esta función producirá la tabla requerida como lista de tuplas.
fuente