This is definitely along the right track but it conflicts a little bit with 
the recommended pandas api, for example:
    query = session.query(Account)
    return pd.read_sql(query.statement, query.session.bind)

I can still follow your method and add each row to a dataframe instead but 
its not as efficient as the above and speed is a concern in this case. And 
you are right I would like to avoid working with the stringified query. Is 
there a solution in this case? Thanks much for the help.

On Friday, March 29, 2019 at 4:33:39 PM UTC-4, Mike Bayer wrote:
>
> On Fri, Mar 29, 2019 at 2:55 PM <[email protected] <javascript:>> wrote: 
> > 
> > I have a model, Account, with two foreign keys / relationships to 
> another model, Users. 
> > 
> > class Account(object): 
> >      @declared_attr 
> >      def customer_id(cls): 
> >           return Column(ForeignKey(User.id)) 
> >      @declared_attr 
> >      def customer(cls): 
> >          return relationship(User, lazy='joined', 
> foreign_keys=cls.customer_id) 
> > 
> >      @declared_attr 
> >      def reporter_id(cls): 
> >           return Column(ForeignKey(User.id)) 
> >      @declared_attr 
> >      def reporter(cls): 
> >          return relationship(User, lazy='joined', 
> foreign_keys=cls.reporter_id) 
> > 
> > session.query(Account) gives me the correct join logic for eager 
> loading. The issue comes when I want to load this data into a pandas 
> dataframe. The joined columns show up labeled as users_1_colname and 
> users_2_colname which makes it unclear which came from reporter and which 
> came from customer. I know in a one off query I can use aliases but how can 
> I have a certain alias dedicated to a relationship? I don't want to 
> manually generate the query and I don't want to change the column names in 
> pandas. I want users_1 to always be labeled reporter and users_2 to always 
> be labeled customer when I query Account. Is this possible? 
>
> When using relationships there is no exposure of any kind of "labels" 
> to the end user, unless you are taking the stringified version of an 
> ORM query using str().   There's no need to do that, as Query can 
> execute the results for you directly where it then returns them as ORM 
> objects, without you ever having to deal with any labels: 
>
> for acc in session.query(Account): 
>     row = {"customer": acc.customer.name, "reporter": 
> acc.reporter.name}  # or whatever fields you want, this assumes there 
> is a "User.name" field 
>     my_dataframe.add_row(row)  # or whatever pandas API is here 
>
> the names you use with the results of an ORM query that uses eager 
> loading are in terms of the attribute names you put on the objects. 
>
> There's a lot of other ways to do this, which can be more automatic, 
> but that's the simplest, feel free to share more details if this is 
> not sufficient. 
>
>
>
> > 
> > -- 
> > 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] <javascript:>. 
> > To post to this group, send email to [email protected] 
> <javascript:>. 
> > Visit this group at https://groups.google.com/group/sqlalchemy. 
> > For more options, visit https://groups.google.com/d/optout. 
>

-- 
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 post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to