On Thu, Jun 20, 2019, at 10:41 AM, Mike Bayer wrote: > > > On Thu, Jun 20, 2019, at 3:14 AM, Chris Withers wrote: >> Hi All, >> >> I'm getting this warning: >> >> SAWarning: Flushing object <Cancelled at 0x10b1b9d30> with incompatible >> polymorphic identity <Types.done: 'DONE'>; the object may not refresh >> and/or load correctly (this warning may be suppressed after 10 occurrences) >> (state_str(state), dict_[polymorphic_key]), >> >> I know why: I'm changing the polymorphic type of a row, but this is >> intentional (it's handling a PUT to the entity the row represents) and I >> don't believe I'll hit refresh or load problems since once the >> transaction is committed, I'm done with the session. >> >> So, two questions: >> >> How can I indicate in my code that this is intentional and no warning >> should be omitted? > > you would need to change its class, or replace it with a new object of the > correct class. in both cases you probably need to pull the object out of the > Session and put it in again. if you are making a new object, you would use > make_transient_to_detached() to give the object a persistent primary key > identity then use session.add() to put it back in again: > > https://docs.sqlalchemy.org/en/13/orm/session_api.html?highlight=make_transient#sqlalchemy.orm.session.make_transient_to_detached > > if you are doing "obj.__class__ = newclass", you probably need to do the same > thing plus more because the identity key needs to have the new class in it, > so you could make_transient() to erase the old identity key and then > make_transient_to_detached() to give it back a new identity key, then > session.add() it. > > in both of *those* cases, the history of the object is reset to "clean", so > anything you actually want to persist on the object needs to be applied after > you've recreated it as a new class with a new identity key. > > still another way, that would not reset the history, you can also manipulate > state.key directly to have the correct identity key and then replace the > object, e.g. > > session.expunge(obj) > obj.__class__ = newclass > obj.polymorphic_identity = 'new_identity' > inspect(obj).key = sqlalchemy.orm.identity_key(instance=obj) > session.add(obj) > > I'd probably want to make a new object and not change __class__, because > changing __class__ in the general case indicates you're going to have an > object where its __dict__ can be in an invalid state vs. what the class > expects. > > > >> >> Why does the following warning filter not work? >> >> warnings.filterwarnings("ignore", category=SADeprecationWarning) >> warnings.filterwarnings("ignore", category=SAWarning) >> >> The SADeprecationWarning filter *does* work (and is somewhat legit as >> they're coming from a third party library that's awaiting a fix), but >> the SAWarning doesn't catch the above. > > that is news to me, if that can be demonstrated that should be posted as a > new bug. suspect the _hash_limit_string() aspect that is doing the > "suppressed after 10 occurrences" part.
this is not reproducing for me: from sqlalchemy import util import warnings from sqlalchemy import exc warnings.filterwarnings("ignore", category=exc.SAWarning) util.warn_limited( "Flushing object %s with " "incompatible polymorphic identity %r; the " "object may not refresh and/or load correctly", (object(), 'foo'), ) with the filter I get no output > > >> >> cheers, >> >> Chris >> >> -- >> 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 sqlalchemy+unsubscr...@googlegroups.com. >> To post to this group, send email to sqlalchemy@googlegroups.com. >> 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/04e4866e-6636-626c-c4f3-16e31849aad2%40withers.org. >> 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 sqlalchemy+unsubscr...@googlegroups.com. > To post to this group, send email to sqlalchemy@googlegroups.com. > 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/4295d9b5-f537-4ca4-8e75-0472a1a62552%40www.fastmail.com > > <https://groups.google.com/d/msgid/sqlalchemy/4295d9b5-f537-4ca4-8e75-0472a1a62552%40www.fastmail.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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. 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/03a62c59-b17d-4ab6-8a0f-c746b1c26413%40www.fastmail.com. For more options, visit https://groups.google.com/d/optout.