[英]Combine two queries, sqlalchemy
我對sqlalchemy(以及sql)真的很陌生,所以請不要拍。
我有兩個疑問:
user_logins_count = self.request.db.query(
sa.func.count(UserSession.id)
).filter(
sa.and_(
UserSession.user_id == user_id,
sa.between(UserSession.date_login_session, start_date, end_date)
)
)
和
user_questions_count = self.request.db.query(
sa.func.count(QuestionAnswer.id).label('questions_amount')
).filter(
sa.and_(
QuestionAnswer.user_id == user_id,
sa.between(QuestionAnswer.created, start_date, end_date)
)
)
是否可以有一個查詢而不是這兩個?
假設UserSession
和QuestionAnswer
是兩個表,其中user_id
可以用作外鍵,您可以執行類似的操作
query(UserSession).join(QuestionAnswer, UserSession.user_id = QuestionAnswer.user_id)
加入表格。 如果您有一個聯接,那么您可以更輕松地將它們作為一個單元進行查詢,假設它們都具有您需要的日期信息。
也就是說,你有一些復雜的東西要檢查,做兩個查詢並將它們連接起來可能比有一個復雜的子查詢更有意義。 或者,做一個union可能是最有意義的!
如果您發布您的數據結構,我可以更具體地幫助您構建一個可以執行您想做的事情的查詢。 這絕對是可能的,但它可能會有點棘手,因此查看您正在使用的數據示例和您構建的數據模型(作為 QuestionAnswer 和 UserSession 表基礎的類)將非常有幫助。
參考
簡單的子查詢應該可以解決問題:
q = session.query(user_logins_count.subquery(), user_questions_count.subquery())
logins_count, questions_count = q.first()
在檢索User
實例本身的同時獲取信息的另一種方法是使用hybrid_method
:
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True)
name = Column(String(255))
@hybrid_method
def user_logins_count(self, start_date: datetime, end_date: datetime):
return len(
[
_login
for _login in self.sessions
if start_date <= _login.date_login_session <= end_date
]
)
@classmethod
@user_logins_count.expression
def user_logins_count_(cls, start_date: datetime, end_date: datetime):
return (
select([func.count(UserSession.id).label("user_logins_count")])
.where(UserSession.user_id == cls.id)
.where(UserSession.date_login_session >= start_date)
.where(UserSession.date_login_session <= end_date)
.group_by(UserSession.user_id)
.label("user_logins_count")
)
在這種情況下,可以執行以下查詢:
res = session.query(User, User.user_logins_count(start_date, end_date)).filter(
User.id == user_id
)
user, logins_count = res.first()
print(user)
print(logins_count)
添加questions_count
可以以相同的方式完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.