I suppose adding the "for" loop may be unnecessary.
Simply change print(entry) in the s.scalars loop to
print(entry.daily_calories_less_than_expected) and you'll (hopefully)
receive a similar error: "AttributeError: 'Entry' object has no attribute
'daily_calories_less_than_expected'"
On Sunday, July 10, 2022 at 10:20:12 AM UTC-6 Montana Burr wrote:
> Thank you, Mike, and apologies for not providing a stack trace or MCVE of
> my own - I assumed the code I did provide was sufficient.
>
> So, take your program and add
>
> for entry in s.execute(query):
> print(entry.daily_calories_less_than_expected)
>
> to the bottom. This represents what I'm trying to do - access an
> apparently nonexistent column (apologies if I didn't make that clear
> earlier).
>
> I just ran your program with that change and was able to reproduce the
> original error, so I'm assuming that either both of our queries are wrong,
> or the code in the "for" loop I just mentioned is wrong.
>
>
>
> On Sunday, July 10, 2022 at 9:27:23 AM UTC-6 Mike Bayer wrote:
>
>> I've converted your fragments into a full MCVE and it runs fine, no error
>> is generated. would need to see a stack trace. Try out the program below
>> also.
>>
>> import datetime
>>
>> from sqlalchemy import Column
>> from sqlalchemy import create_engine
>> from sqlalchemy import Date
>> from sqlalchemy import DateTime
>> from sqlalchemy import ForeignKey
>> from sqlalchemy import func
>> from sqlalchemy import Integer
>> from sqlalchemy import select
>> from sqlalchemy import String
>> from sqlalchemy.orm import declarative_base
>> from sqlalchemy.orm import relationship
>> from sqlalchemy.orm import Session
>>
>> Base = declarative_base()
>>
>>
>> class User(Base):
>> __tablename__ = "Users"
>> id = Column(Integer, primary_key=True)
>> username = Column(String)
>> password_hash = Column(String)
>> entries = relationship("Entry")
>> daily_expected_calories = relationship("DailyExpectedCalories")
>>
>>
>> class Entry(Base):
>> __tablename__ = "Entries"
>> id = Column(Integer, primary_key=True)
>> user_id = Column(Integer, ForeignKey("Users.id"))
>> timestamp = Column(DateTime(timezone=True))
>> time_zone_utc_offset = Column(Integer)
>> calorie_count = Column(Integer)
>> meal = Column(String)
>>
>>
>> class DailyExpectedCalories(Base):
>> __tablename__ = "DailyExpectedCalories"
>> date = Column(Date, primary_key=True)
>> user_id = Column(Integer, ForeignKey("Users.id"), primary_key=True)
>> expected_Calories = Column(Integer)
>>
>>
>> query_calorie_sum_less_than_expected = (
>> select(
>> Entry.user_id,
>> (
>> func.sum(Entry.calorie_count)
>> < DailyExpectedCalories.expected_Calories
>> ).label("daily_calorie_sum_less_than_expected"),
>> )
>> .join(
>> DailyExpectedCalories, Entry.user_id ==
>> DailyExpectedCalories.user_id
>> )
>> .subquery()
>> )
>>
>> query = (
>> select(Entry)
>> .outerjoin(
>> query_calorie_sum_less_than_expected,
>> Entry.user_id == query_calorie_sum_less_than_expected.c.user_id,
>> )
>> .where(Entry.user_id == User.id)
>> )
>>
>>
>> e = create_engine("sqlite://", echo=True)
>>
>> Base.metadata.create_all(e)
>> s = Session(e)
>> with s.no_autoflush:
>> s.add_all(
>> [
>> User(
>> username="u1",
>> entries=[Entry()],
>> daily_expected_calories=[
>> DailyExpectedCalories(
>> date=datetime.date.today(), expected_Calories=2000
>> )
>> ],
>> )
>> ]
>> )
>> s.commit()
>>
>> for entry in s.scalars(query):
>> print(entry)
>>
>>
>> On Sat, Jul 9, 2022, at 4:12 PM, Montana Burr wrote:
>>
>> Hi folks!
>>
>> I have a rather complicated SQL query to perform. I kind of know how
>> I would do it in SQL and am looking to port it to SQLAlchemy.
>>
>> I have these ORM classes:
>>
>> class User(Base):
>> __tablename__ = "Users"
>> id = Column(Integer, primary_key=True)
>> username = Column(String)
>> password_hash = Column(String)
>> entries = relationship("Entry")
>> daily_expected_calories = relationship("DailyExpectedCalories")
>>
>> class Entry(Base):
>> __tablename__ = "Entries"
>> id = Column(Integer, primary_key=True)
>> user_id = Column(Integer, ForeignKey("Users.id"))
>> timestamp = Column(DateTime(timezone=True))
>> time_zone_utc_offset = Column(Integer)
>> calorie_count = Column(Integer)
>> meal = Column(String)
>>
>>
>> class DailyExpectedCalories(Base):
>> __tablename__ = "DailyExpectedCalories"
>> date = Column(Date, primary_key=True)
>> user_id = Column(Integer, ForeignKey("Users.id"), primary_key=True)
>> expected_Calories = Column(Integer)
>>
>> and I am looking to build a query that gives me objects of type Entry and
>> a Boolean field indicating whether the user has consumed fewer calories
>> than expected during the day of the Entry.
>>
>> For example, if I a 1111-Calorie food in the morning, a 2222-Calorie food
>> in the afternoon, and a 3333-Calorie food in the afternoon, but I only
>> expected to eat 3000 Calories, the results of the query might look
>> something like this:
>>
>> 07/09/2022 9:00 AM 1111 False
>> 07/09/2022 1:00 PM 2222 False
>> 07/09/2022 7:00 PM 3333 False
>>
>> I've come up with these queries:
>>
>> query_calorie_sum_less_than_expected = select(Entry.user_id, (
>> func.sum(Entry.calorie_count) < DailyExpectedCalories.
>> expected_Calories
>> ).label("daily_calorie_sum_less_than_expected")).join(
>> DailyExpectedCalories,
>> Entry.user_id == DailyExpectedCalories.user_id).subquery()
>> query = select(Entry).outerjoin(
>> query_calorie_sum_less_than_expected,
>> Entry.user_id == query_calorie_sum_less_than_expected
>> .c.user_id).where(
>> Entry.user_id == user.id)
>>
>> but when I do
>>
>> results = engine.execute(query)
>>
>> and then do something like
>>
>> for row in results:
>> results.daily_calorie_sum_less_than_expected
>>
>> SQLAlchemy complains that the aforementioned column does not exist.
>>
>> So how would I do the kind of query I'm looking to do?
>>
>>
>> --
>> SQLAlchemy -
>> The Python SQL Toolkit and Object Relational Mapper
>>
>> http://www.sqlalchemy.org/
>>
>> To post example code, please provide an MCVE: Minimal, Complete, and
>> Verifiable Example. See http://stackoverflow.com/help/mcve for a full
>> description.
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "sqlalchemy" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/sqlalchemy/4b724e77-da6c-4581-aecb-f9196e53ab80n%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/sqlalchemy/4b724e77-da6c-4581-aecb-f9196e53ab80n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>>
>>
--
SQLAlchemy -
The Python SQL Toolkit and Object Relational Mapper
http://www.sqlalchemy.org/
To post example code, please provide an MCVE: Minimal, Complete, and Verifiable
Example. See http://stackoverflow.com/help/mcve for a full description.
---
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sqlalchemy/f254c853-ab33-4104-93b2-c8b16458784an%40googlegroups.com.