반응형
sqlalchemy: 여러 테이블을 하나의 쿼리로 조인하는 방법은 무엇입니까?
다음과 같은 SQL 화학 매핑 클래스가 있습니다.
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"))
다음을 위해 이런 자리를 마련해야 합니다.user.email = "user@email.com"
:
email | name | document_name | document_readAllowed | document_writeAllowed
SQLAlchemy에 대한 하나의 쿼리 요청을 사용하여 어떻게 만들 수 있습니까?아래 코드는 나에게 적용되지 않습니다.
result = session.query(User, Document, DocumentPermission).filter_by(email = "user@email.com").all()
감사해요.
사용해 보세요.
q = Session.query(
User, Document, DocumentPermissions,
).filter(
User.email == Document.author,
).filter(
Document.name == DocumentPermissions.document,
).filter(
User.email == 'someemail',
).all()
@letitbe가 말했듯이 테이블에 기본 키를 할당하고 적절한 ORM 쿼리를 허용하도록 관계를 적절하게 정의하는 것이 가장 좋습니다.그 말을 들으니...
다음 항목에 따라 쿼리를 작성할 의향이 있는 경우:
SELECT
user.email,
user.name,
document.name,
documents_permissions.readAllowed,
documents_permissions.writeAllowed
FROM
user, document, documents_permissions
WHERE
user.email = "user@email.com";
그렇다면 다음과 같은 것을 선택해야 합니다.
session.query(
User,
Document,
DocumentsPermissions
).filter(
User.email == Document.author
).filter(
Document.name == DocumentsPermissions.document
).filter(
User.email == "user@email.com"
).all()
대신 다음과 같은 작업을 수행할 수 있습니다.
SELECT 'all the columns'
FROM user
JOIN document ON document.author_id = user.id AND document.author == User.email
JOIN document_permissions ON document_permissions.document_id = document.id AND document_permissions.document = document.name
그런 다음 다음과 같은 작업을 수행해야 합니다.
session.query(
User
).join(
Document
).join(
DocumentsPermissions
).filter(
User.email == "user@email.com"
).all()
그에 대한 한 가지 메모는...
query.join(Address, User.id==Address.user_id) # explicit condition
query.join(User.addresses) # specify relationship from left to right
query.join(Address, User.addresses) # same, with explicit target
query.join('addresses') # same, using a string
자세한 내용은 문서를 참조하십시오.
일부 관계와 권한에 대한 기본 키를 설정하는 것이 좋습니다(실제로 일반적으로 모든 항목에 대해 정수 기본 키를 설정하는 것이 좋습니다).
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_email = Column(String, ForeignKey("users.email"))
author = relation(User, backref='documents')
class DocumentsPermissions(Base):
__tablename__ = "documents_permissions"
id = Column(Integer, primary_key=True)
readAllowed = Column(Boolean)
writeAllowed = Column(Boolean)
document_name = Column(String, ForeignKey("documents.name"))
document = relation(Document, backref = 'permissions')
그런 다음 조인을 사용하여 간단한 쿼리를 수행합니다.
query = session.query(User, Document, DocumentsPermissions).join(Document).join(DocumentsPermissions)
Abdul의 답변을 확장하면 열을 결합하여 개별 행 집합 대신 을 얻을 수 있습니다.
q = Session.query(*User.__table__.columns + Document.__table__.columns).\
select_from(User).\
join(Document, User.email == Document.author).\
filter(User.email == 'someemail').all()
이 함수는 튜플 목록으로 필요한 표를 생성합니다.
def get_documents_by_user_email(email):
query = session.query(
User.email,
User.name,
Document.name,
DocumentsPermissions.readAllowed,
DocumentsPermissions.writeAllowed,
)
join_query = query.join(Document).join(DocumentsPermissions)
return join_query.filter(User.email == email).all()
user_docs = get_documents_by_user_email(email)
언급URL : https://stackoverflow.com/questions/6044309/sqlalchemy-how-to-join-several-tables-by-one-query
반응형
'sourcetip' 카테고리의 다른 글
mkdir vs New-Item, 같은 cmdlet입니까? (0) | 2023.08.21 |
---|---|
클래스 Y의 개체 X가 Swift에서 methodSignatureForSelector를 구현하지 않습니다. (0) | 2023.08.21 |
XML을 사용하여 ActionBar Activity의 ActionBar 배경색을 변경하려면 어떻게 해야 합니까? (0) | 2023.08.21 |
송장, 송장 라인 및 수정사항에 대한 데이터베이스 설계 (0) | 2023.08.21 |
SQL 서버 실제 데이터 유형, C#에 해당하는 것은 무엇입니까? (0) | 2023.08.21 |