Actually yeah, you are correct on that.   I was trying to have separate
backrefs on UserKeywprd and this was part of that.

On Sunday, August 21, 2016, Tom Kedem <tomke...@gmail.com> wrote:

> I see. I think I can do okay without UserKeyword.user, as you suggested.
> Seems to work.
> Though is it really necessary to define user_keywords relationship both on
> user and super_user? It seems to be working with only defining it in user.
>
> On Sunday, August 21, 2016 at 9:33:01 PM UTC+3, Mike Bayer wrote:
>>
>>
>>
>> On 08/21/2016 10:22 AM, Tom Kedem wrote:
>> > It seems I confused "concrete" with "joined" inheritance.
>> >
>> > What I want to achieve is /joined/ inheritance. I've modified the code
>> > to reflect that (just removed all concrete references).
>> > According to the documentation relationships on joined inheritance are
>> > inherited, but I still get an error saying it doesn't recognize
>> > super_user as a child of user.
>>
>>
>> This is the error:
>>
>> sqlalchemy.orm.exc.FlushError: Attempting to flush an item of type
>> <class '__main__.SuperUser'> as a member of collection
>> "UserKeyword.user". Expected an object of type <class '__main__.User'>
>> or a polymorphic subclass of this type. If <class '__main__.SuperUser'>
>> is a subclass of <class '__main__.User'>, configure mapper
>> "Mapper|User|user" to load this subtype polymorphically, or set
>> enable_typechecks=False to allow any subtype to be accepted for flush.
>>
>>
>> this error is more of a warning to stop you from proceeding as though
>> things are "normal" - it has no problem persisting a SuperUser here,
>> however when you go later to load some_user_keyword.user, it will query
>> the user table only, and return a User object, not a SuperUser.  It's
>> not possible for it to detect a SuperUser because you aren't using a
>> discriminator.
>>
>> Your options are:
>>
>> 1. make two separate user_keywords relationships, and get rid of
>> UserKeyword.user totally, since it can't be relied upon to load a
>> SuperUser.
>>
>> 2. same thing, but keep UserKeyword.user and set the above-mentioned
>> enable_typechecks=False on it.  Still risky to call upon it because it
>> can't load a SuperUser.   see attached.
>>
>> Unfortunately, it does not seem to be possible to have a "user" and a
>> separate "super_user" relationship on UserKeyword that share the same
>> UserKeyword.user_id parameter, and they appear to conflict on flush.
>>
>> 3. Use polymorphic loading without a discriminator column, by using a
>> CASE expression that checks for the super_user table being present in a
>> row.   This is a lot like what the concrete polymorphic loading does,
>> though we don't have the declarative helpers for this pattern.   Setting
>> it up would be a little more manual and it means all queries for User,
>> or at least the ones from UserKeyword.user if we made a special mapper
>> just for this operation, would query an outer join against both tables.
>> I can try to work this out if you are interested.  But I don't think you
>> even need to have UserKeyword.user here.
>>
>>
>>
>>
>>
>> >
>> >
>> > On Sunday, August 21, 2016 at 6:37:19 AM UTC+3, Mike Bayer wrote:
>> >
>> >
>> >
>> >     On 08/20/2016 08:27 PM, Tom Kedem wrote:
>> >     > I suppose I could have a discriminator value for "function type",
>> >     but I
>> >     > have no use for it now (so yeah, the base class is a single
>> column
>> >     one).
>> >     >
>> >     > It's a simplified model. The real use-case is as such - the base
>> >     class
>> >     > is "function" and the inheriting classes are all sorts of
>> >     functions (all
>> >     > concrete classes). They all have a collection of "arguments"
>> (many to
>> >     > many), which I define in the base class - since the "arguments"
>> >     can only
>> >     > point to a single table.
>> >     >
>> >     > Maybe it's not the best mapping, I'm open for suggestions. But is
>> >     there
>> >     > anything wrong in my configuration or understanding?
>> >
>> >     Two things do not make sense, in terms of the use of ConcreteBase
>> and
>> >     "concrete=True".
>> >
>> >     One is:
>> >
>> >
>> >          id = Column(Integer, ForeignKey(User.id), primary_key=True)
>> >
>> >     on SuperUser.
>> >
>> >     The other is:
>> >
>> >     class UserKeyword(Base):
>> >          __tablename__ = 'user_keyword'
>> >          user_id = Column(Integer, ForeignKey('user.id
>> >     <http://user.id>'), primary_key=True)
>> >
>> >
>> >     both of these imply that the fields of a SuperUser object are
>> stored in
>> >     the "super_user" table *and* the "user" table.
>> >
>> >     Also, when you say "I suppose I could have a discriminator..." in
>> >     response to the question, "did you mean for this to be joined
>> >     inheritance?",  that suggests you might be under the impression
>> that
>> >     "don't have a discriminator" means you must use "concrete
>> inheritance",
>> >     which is not true.    A "discriminator" is not necessary for any
>> style
>> >     of inheritance, as long as you don't need to load objects
>> >     polymorphically.
>> >
>> >     Same question as before, more specifically.  When you load a row
>> from
>> >     "super_user" in order to get a SuperUser object, should the ORM
>> also be
>> >     loading a row from "user" that matches up to it?  Or can you get
>> every
>> >     possible field in a SuperUser from the "super_user" table alone
>> without
>> >     ever looking at "user"?  If the former, that would be joined
>> >     inheritance.   that's what this looks like.
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >     >
>> >     > On Saturday, August 20, 2016 at 10:44:24 PM UTC+3, Mike Bayer
>> wrote:
>> >     >
>> >     >     This doesn't look like a concrete mapping, you have a foreign
>> key
>> >     >     from SuperUser to User.   Are you sure this isn't supposed to
>> >     be an
>> >     >     ordinary joined inheritance model ?
>> >     >
>> >     >     On Saturday, August 20, 2016, Tom Kedem <tomk...@gmail.com
>> >     >     <javascript:>> wrote:
>> >     >
>> >     >         I have the following setup (attached python file).
>> >     >         I'm using an inheritance hierarchy without a
>> discriminator
>> >     >         field, deriving from AbstractBase.
>> >     >         I want to be able to use the "keywords" attribute in the
>> >     >         "SuperUser" class, and from the documentation I
>> understand I
>> >     >         need to redefine it, however that doesn't seem to work.
>> >     >         I assume I could manually use a primary join there (as
>> the
>> >     error
>> >     >         indicates), but as I understand that's exactly what
>> >     >         "AbstractBase" class should handle...
>> >     >
>> >     >         --
>> >     >         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+...@googlegroups.com
>> >     <javascript:>.
>> >     >         To post to this group, send email to
>> >     sqlal...@googlegroups.com <javascript:>.
>> >     >         Visit this group at
>> >     https://groups.google.com/group/sqlalchemy
>> >     <https://groups.google.com/group/sqlalchemy>
>> >     >         <https://groups.google.com/group/sqlalchemy
>> >     <https://groups.google.com/group/sqlalchemy>>.
>> >     >         For more options, visit https://groups.google.com/d/op
>> tout
>> >     <https://groups.google.com/d/optout>
>> >     >         <https://groups.google.com/d/optout
>> >     <https://groups.google.com/d/optout>>.
>> >     >
>> >     > --
>> >     > 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+...@googlegroups.com <javascript:>
>> >     > <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:>>.
>> >     > To post to this group, send email to sqlal...@googlegroups.com
>> >     <javascript:>
>> >     > <mailto:sqlal...@googlegroups.com <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>.
>> >
>> > --
>> > 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+...@googlegroups.com
>> > <mailto:sqlalchemy+unsubscr...@googlegroups.com>.
>> > To post to this group, send email to sqlal...@googlegroups.com
>> > <mailto:sqlal...@googlegroups.com>.
>> > Visit this group at https://groups.google.com/group/sqlalchemy.
>> > For more options, visit https://groups.google.com/d/optout.
>>
> --
> 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
> <javascript:_e(%7B%7D,'cvml','sqlalchemy%2bunsubscr...@googlegroups.com');>
> .
> To post to this group, send email to sqlalchemy@googlegroups.com
> <javascript:_e(%7B%7D,'cvml','sqlalchemy@googlegroups.com');>.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to