On Wed, May 22, 2019, at 2:09 PM, Tony Cao wrote: > Sorry, I will clarify what I was asking. If I had my class example from above: > > class A(Base): > foo = Column(String) > bar = Column(String) > foo_updated = Column(DateTime, onupdate=update_fn) # Should only update when > foo is updated > > Based on what information is in the context, sometimes I may not want to > update the value. However, my understanding is that onupdate_fn *must* return > a value always. > > Given that we need to return a value from onupdate_fn, one idea I had was to > return a value to emit: > UPDATE A SET bar="new value", foo_updated=A.foo_updated WHERE id = 1 > > If we can somehow specify "set foo_updated to whatever value it already is" > in SQL land, then we should be set! However, I tried some variations of this: > - `return 'foo_updated'` > - `return '"foo_updated"' > - `return A.foo_updated` > - `return A.__table__.c.foo_updated` > > > and none of these ended up working. Do you know if there's a way to specify > an onupdate function to return a SQL column?
again, within the "onupdate" handler, the SQL has already been written. You can't change the bound parameter SQL syntax to be a column syntax at that point, you can only return a Python value. You would need to rewrite the string using the before_cursor_update event, or modify the kind of statement to be generated using the before_execute or ORM level before_update / etc. events I illustrated earlier. > > On Thursday, May 16, 2019 at 2:49:56 PM UTC-7, Mike Bayer wrote: >> On Thu, May 16, 2019 at 4:26 PM Tony Cao <[email protected]> wrote: >> > >> > Ohh I see thanks for the help! >> > >> > And just to confirm on the onupdate front, is it not possible to return >> > the current value of the object being updated? It's ok to emit an >> > extraneous update if the value doesn't change. >> >> inside the onupdate handler you can see the current statement and the >> parameters in the context, as far as the "a_1" thing, the parameters >> for the columns being SET should be the same keys as the column >> itself, it's the WHERE clause where you'd see the underscore thing >> happening. show me what you get if you want to work with that. >> >> >> >> >> > >> > On Wednesday, May 15, 2019 at 5:30:06 PM UTC-7, Mike Bayer wrote: >> >> >> >> On Wed, May 15, 2019 at 6:10 PM Tony Cao <[email protected]> wrote: >> >> > >> >> > I mean query.update(). >> >> > >> >> > Ah our goal was to make it so the update in question happened >> >> > automatically without the developer having to explicitly specify it - >> >> > in that case both obj.attr = x and obj_class.query.update({obj.attr: >> >> > x}) should both trigger an update to obj.attr_modified. That's why I >> >> > initially asked about onupdate, as it is triggered for both cases. >> >> >> >> >> >> for query.update() you can use the before_compile_update() and modify >> >> the context.values dictionary in place to affect the UPDATE statement >> >> generated by query.update(). See >> >> https://docs.sqlalchemy.org/en/13/orm/events.html?highlight=before_compile_update#sqlalchemy.orm.events.QueryEvents.before_compile_update. >> >> >> >> Additional detail regarding .values will be up within 30 minutes. >> >> >> >> >> >> > >> >> > >> >> > On Wednesday, May 15, 2019 at 2:38:19 PM UTC-7, Mike Bayer wrote: >> >> >> >> >> >> Bulk query updates, you mean, query.update() ? Or >> >> >> session.bulk_update_mappings() ? In both cases you are >> >> >> programatically providing the VALUES clause, so you know from your own >> >> >> data what the UPDATE statement will be. >> >> >> >> >> >> >> >> >> >> >> >> On Wed, May 15, 2019 at 4:14 PM Tony Cao <[email protected]> wrote: >> >> >> > >> >> >> > Ah but it also looks like the before_update event isn't triggered >> >> >> > when doing bulk query updates, which we'd like to also update on. Is >> >> >> > there a way to track those? >> >> >> > >> >> >> > On Wednesday, May 15, 2019 at 10:38:24 AM UTC-7, Mike Bayer wrote: >> >> >> >> >> >> >> >> you can inspect() the object and look at >> >> >> >> inspect(obj).attrs['some_attr'].history >> >> >> >> >> >> >> >> https://docs.sqlalchemy.org/en/13/orm/internals.html#sqlalchemy.orm.state.AttributeState >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> On Wed, May 15, 2019 at 1:14 PM Tony Cao <[email protected]> >> >> >> >> wrote: >> >> >> >> > >> >> >> >> > Hi, >> >> >> >> > >> >> >> >> > Thanks for the response! I also tried looking into before_update, >> >> >> >> > but is there a recommended way to figure out what columns are >> >> >> >> > being updated from that event? I had found this post >> >> >> >> > (https://stackoverflow.com/questions/15642286/how-can-i-get-a-sqlalchemy-orm-objects-previous-state-after-a-db-update) >> >> >> >> > that suggests looking at the history of the attribute state - is >> >> >> >> > there a better way? >> >> >> >> > >> >> >> >> > On Wednesday, May 15, 2019 at 7:55:44 AM UTC-7, Mike Bayer wrote: >> >> >> >> >> >> >> >> >> >> On Mon, May 13, 2019 at 4:18 PM Tony Cao <[email protected]> >> >> >> >> >> wrote: >> >> >> >> >> > >> >> >> >> >> > Hi all, >> >> >> >> >> > >> >> >> >> >> > Is there way to use Column.onupdate conditionally? For >> >> >> >> >> > example, say I have: >> >> >> >> >> > >> >> >> >> >> > class A(Base): >> >> >> >> >> > foo = Column(String) >> >> >> >> >> > bar = Column(String) >> >> >> >> >> > foo_updated = Column(DateTime, onupdate=update_fn) # Should >> >> >> >> >> > only update when foo is updated >> >> >> >> >> > >> >> >> >> >> > def update_fn(context): >> >> >> >> >> > if ...: # How can I check if only foo was updated? >> >> >> >> >> > return datetime.now() >> >> >> >> >> > else: >> >> >> >> >> > return ... # How can I say to not update? >> >> >> >> >> > >> >> >> >> >> > Is there a way to define update_fn to only update foo_updated >> >> >> >> >> > when foo changes? I can look at >> >> >> >> >> > context.get_current_parameters() to see what columns are being >> >> >> >> >> > used in the compiled statement, but it doesn't explicitly say >> >> >> >> >> > which columns are the ones actually being updated; for >> >> >> >> >> > example, if I have >> >> >> >> >> > >> >> >> >> >> > A.query.filter(A.bar == 'test').update({A.foo: 'new'}, >> >> >> >> >> > synchronize_session=False) >> >> >> >> >> > >> >> >> >> >> > then context.get_current_parameters will return a dict with >> >> >> >> >> > keys for both 'bar' and 'foo', although it looks like it >> >> >> >> >> > suffixes the filter param with a '_1' - is that something I >> >> >> >> >> > can rely on to know if a column is used as a filter instead of >> >> >> >> >> > an update? And beyond that, is there a way I can specify to >> >> >> >> >> > not update the column? >> >> >> >> >> > >> >> >> >> >> > Alternatively, is there another approach recommended to doing >> >> >> >> >> > this? >> >> >> >> >> >> >> >> >> >> the most common way is to use the ORM level before_update event: >> >> >> >> >> >> >> >> >> >> https://docs.sqlalchemy.org/en/13/orm/events.html?highlight=before_update#sqlalchemy.orm.events.MapperEvents.before_update >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> there's also before_execute() at the Core level, but before the >> >> >> >> >> UPDATE >> >> >> >> >> statement is even written, e.g. at the ORM level, is the best >> >> >> >> >> way. >> >> >> >> >> Once you are in the onupdate Python function, you have to return >> >> >> >> >> a >> >> >> >> >> value, as this occurs well after the UPDATE statement has been >> >> >> >> >> compiled. >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> > >> >> >> >> >> > Thanks! >> >> >> >> >> > >> >> >> >> >> > -- >> >> >> >> >> > 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. >> >> >> >> >> > To view this discussion on the web visit >> >> >> >> >> > https://groups.google.com/d/msgid/sqlalchemy/b66e89c9-6618-4600-9381-182fa101f5b6%40googlegroups.com. >> >> >> >> >> > >> >> >> >> >> > 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. >> >> >> >> > To view this discussion on the web visit >> >> >> >> > https://groups.google.com/d/msgid/sqlalchemy/f13c4205-1df5-49c5-8c91-3c97cd8d9b05%40googlegroups.com. >> >> >> >> > >> >> >> >> > 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. >> >> >> > To view this discussion on the web visit >> >> >> > https://groups.google.com/d/msgid/sqlalchemy/38b1162d-1204-41b7-9649-3938775eeef8%40googlegroups.com. >> >> >> > >> >> >> > 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. >> >> > To view this discussion on the web visit >> >> > https://groups.google.com/d/msgid/sqlalchemy/6dfe0cd9-c55c-486a-94b0-85eb222bdb55%40googlegroups.com. >> >> > >> >> > 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. >> > To view this discussion on the web visit >> > https://groups.google.com/d/msgid/sqlalchemy/1151a938-bcce-4d16-ba18-d2e489af7af3%40googlegroups.com. >> > >> > 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. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sqlalchemy/bc2bce76-29bc-491d-a25b-f304a4274f1f%40googlegroups.com > > <https://groups.google.com/d/msgid/sqlalchemy/bc2bce76-29bc-491d-a25b-f304a4274f1f%40googlegroups.com?utm_medium=email&utm_source=footer>. > 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. To view this discussion on the web visit https://groups.google.com/d/msgid/sqlalchemy/cffdc99b-8751-4a43-a3a9-e699a9e0da59%40www.fastmail.com. For more options, visit https://groups.google.com/d/optout.
