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
join
hace? interior, exterior, cruz o qué?[(<user>, <document>, <documentpermissions>),...]
/select x from a, b ,c
que 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
query
establece 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" % doc
Como 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
KeyedTuple
colección de filas en lugar de una discreta uniendo las columnas:fuente
Esta función producirá la tabla requerida como lista de tuplas.
fuente