>
> why don't you use a relationship() with the bound parameter? there's a
> recipe for this at
> https://bitbucket.org/zzzeek/sqlalchemy/wiki/UsageRecipes/GlobalFilter.
seems it's exactly what I need!
Two last questions:
1. Is it possible to specify "path" to get needed value from bound param,
so I can bind request instance for each query in my framework and a model
will get a value it needs. Something like:
favorite = relationship(
User,
primaryjoin=Book.id == UserFavoriteBooks.book_id,
secondaryjoin=and_(
UserFavoriteBooks.user_id == User.id,
User.id == bindparam("request", lambada req: req.user.id)
)
)
query:
books = session.query(requested_class).params(request=request).all()
and wouldn't it break if some models doesn't specify any bindparam but I
bound it to query?
That's all because I build query automatically in my framework base on
resource requested by user
2. Can I make a relationship that will result in bool value:
favorite = relationship(User, ...., collection_class=bool)?
Thanks
On Monday, February 6, 2017 at 10:44:42 PM UTC+3, Mike Bayer wrote:
>
>
>
> On 02/06/2017 01:45 PM, Евгений Иванов wrote:
> > By fake I mean the field is not present in db, but present in model and
> > calculated when model is loaded. Favorite is a fields for Book model and
> > can be represented by something similar to:
> >
> > class Book(Base):
> > id = Column(...)
> > name = Column(...)
> > favorite_for = relationship(User, secondary=UserFavoriteBooks,
> > backref=favorite_books)
> > @property
> > def favorite(self)
> > return request.user.id in [u.id for u in self.favorite_for]
> >
> > request is global here.
> >
> > But I wan't it to be calculated once model is loaded, I think that could
> > be achieved by column_property by select() with case() to check if
> > current user is in the favorite_for list.
>
> why don't you use a relationship() with the bound parameter? there's a
> recipe for this at
> https://bitbucket.org/zzzeek/sqlalchemy/wiki/UsageRecipes/GlobalFilter.
> I guess it's a little more up-front code than the column_property()
> but once you have it, you get this cool effect:
>
> obj = session.query(MyObject).\
> options(WithFavoriteItem(request.params['favorite_id'])).\
> one()
>
>
>
>
> If column_property is not
> > refreshed for every query it will be fine for this example (since user
> > is the same in scope of one http request, so doesn't change during
> > session lifetime), but could be a problem for other models if I compare
> > (in where clause) to something with more dynamic nature.
>
>
> Well your immediate use case is per-request. I'd propose YAGNI for the
> "what if? what if?" part of this because this is not really a common use
> case.
>
>
> I just wonder
> > if there is a mechanism in SQLAlchemy that allows to have model fields
> > that calculated at query time and can be configured before the query is
> > emitted.
>
> that's what we're doing here w/ both the column_property you were doing
> and the relationship.
>
> If you want the column and/or relationship loaded all at once when you
> do query(), and you're concerned it was already loaded, just do
> populate_existing() and that will load it no matter what.
>
>
> > I can extend my example: backend renders reply with list of users, for
> > each user there is a list of books they bought, and for each book there
> > is a favorite filed which tells if this book bought by this user is
> > marked as favorite for him:
> > [{
> > name: "John Doe",
> > books: [{
> > name: "foo",
> > favorite: true
> > },
> > {
> > name: "bar",
> > favorite: false
> > }
> > }]
> > },
> > {
> > name: "Jane Roe",
> > books: [{
> > name: "foo",
> > favorite: false
> > },
> > {
> > name: "bar",
> > favorite: true
> > }
> > }]
> >
> > On Monday, February 6, 2017 at 7:13:02 PM UTC+3, Mike Bayer wrote:
> >
> >
> >
> > On 02/06/2017 11:02 AM, Евгений Иванов wrote:
> > > I need a dynamically calculated column for my model.
> column_property
> > > looks great for that, but problem here that it's compiled at time
> > when
> > > model is mapped and I need to provide some value for filtering at
> > time
> > > the request is executed. I thought that bindparam can solve that
> > problem
> > > for me, but found that topic:
> > >
> >
> https://bitbucket.org/zzzeek/sqlalchemy/issues/3620/new-query-doesnt-expire-column_property
>
> > <
> https://bitbucket.org/zzzeek/sqlalchemy/issues/3620/new-query-doesnt-expire-column_property>
>
>
> >
> > >
> > > this is not really a great way to use column_property as it is
> > > treated like any other persisted attribute, and is not
> reloaded
> > > unnecessarily.
> >
> >
> > you can use column_property with a bound parameter it just wont
> > normally
> > be refreshed if you query for the same object again when it's
> already
> > loaded. it depends on what you want things to do.
> >
> >
> > > |
> > > User:
> > > id
> > > name
> > >
> > > Book:
> > > id
> > > name
> > >
> > > UserFavoriteBooks:
> > > user_id
> > > book_id
> > > |
> > >
> > > So I have many-to-many relation between users and books to
> represent
> > > list of favorite books for a user. Then some user queries a book
> > from DB
> > > and want to know if it's in his favorite list, so I need to query
> the
> > > Book entry for db with some fake bool column "favorite" which is
> > checked
> > > over the current user (who performed the request). Is it possible
> > to do
> > > that in SQLAlchemy so the "favorite" fields is automatically
> > filled with
> > > correct value once I do a query for a Book?
> >
> > what's a "fake" column? if "favorite" is a column in
> > UserFavoriteBooks
> > you'd use the association object pattern, i dont see where the
> > column_property/bind thing is used there.
> >
> >
> >
> > >
> > > BR, Evgeny
> > >
> > > --
> > > 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
> > <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:>
> > > <mailto:[email protected] <javascript:>
> <javascript:>>.
> > > To post to this group, send email to [email protected]
> > <javascript:>
> > > <mailto:[email protected] <javascript:>>.
> > > Visit this group at https://groups.google.com/group/sqlalchemy
> > <https://groups.google.com/group/sqlalchemy>.
> > > For more options, visit https://groups.google.com/d/optout
> > <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] <javascript:>
> > <mailto:[email protected] <javascript:>>.
> > To post to this group, send email to [email protected]
> <javascript:>
> > <mailto:[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.