On 9/16/15 5:28 AM, Jakub Bąk wrote:
Thanks a lot! It works but I still have a problem. I want to make one query to get the root directory, all its children and the filenames of Image objects.
My directory model looks like this:

|
classDirectory(Node):
    is_root =db.Column(db.Boolean,default=False)
children =db.relationship(Node,cascade_backrefs=False,backref=db.backref('parent',remote_side=[Node.id]),lazy='joined',join_depth=10)
|

When I use the query that you suggested I get the filenames instantly but I don't get the eager loading of the children. I also tried this:

|
db.session.query(Node).with_polymorphic([Directory,Image]).all()
|

And I still only get the filenames without eager loading of Directory children.

This is all worked out if you look into the techniques documented in http://docs.sqlalchemy.org/en/rel_1_0/orm/inheritance.html#eager-loading-of-specific-or-polymorphic-subtypes





W dniu wtorek, 15 września 2015 17:17:12 UTC+2 użytkownik Michael Bayer napisał:



    On 9/15/15 10:09 AM, Jakub Bąk wrote:
    I used before_delete and after_commit and it works like a charm.
    Thanks again!

    I have another problem related to this setup. I have a property
    defined on the Image model:

    |
    @property
    deffilename(self):
    
return'{basename}.{extension}'.format(basename=self.basename,extension=self.extension)
    |

    When I make this query:

    |
    image =db.session.query(Image).get(100)
    image.filename
    |

    I get the filename property istantly but when I do it like this:

    |
    node =db.session.query(Node).get(100)
    node.filename
    |

    Another query has to be issued which is not what I want. Do you
    know any possible solution to that problem Michael?

    that is again the way the joined-table inheritance works; by
    default it only queries the base table.   Per query you'd do it
    like this:

    session.query(Node).with_polymorphic(Image).get(100)






    W dniu wtorek, 25 sierpnia 2015 17:16:16 UTC+2 użytkownik Michael
    Bayer napisał:



        On 8/25/15 10:05 AM, Jakub Bąk wrote:
        I just came across a solution to this problem.
        Adding 'with_polymorphic': '*' to __mapper_args__ on the
        Node model was enough.

        |
        classNode(db.Model):
           id =db.Column(db.Integer,primary_key=True)
         type =db.Column(db.String(20))
         name =db.Column(db.String(30),nullable=False)
         date_added =db.Column(db.DateTime,default=datetime.now())
         parent_id =db.Column(db.Integer,db.ForeignKey('node.id
        <http://node.id/>'),nullable=True)
         path =db.Column(db.String(200),default='')
         __mapper_args__ ={'polymorphic_on':type,
        'with_polymorphic':'*'}
        |


        OK, yeah that's a funny problem you have.   The
        with_polymorphic in all cases is going to lead to heavier
        queries, because there's the join but also if you already
        have joins between Node classes, you'll start to see some
        very long queries with lots of joins / sub-joins.

        A more portable solution would be to also implement
        before_delete(), where you either ensure that the Image
        columns are loaded, or you add the files to be deleted to
        some kind of collection; then you'd actually delete the files
        using a safer event like after_commit(), so that way if your
        transaction fails, the files are preserved.





-- 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.
        To post to this group, send email to sqlal...@googlegroups.com.
        Visit this group at
        http://groups.google.com/group/sqlalchemy
        <http://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 <javascript:>.
    To post to this group, send email to sqlal...@googlegroups.com
    <javascript:>.
    Visit this group at http://groups.google.com/group/sqlalchemy
    <http://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+unsubscr...@googlegroups.com <mailto:sqlalchemy+unsubscr...@googlegroups.com>. To post to this group, send email to sqlalchemy@googlegroups.com <mailto:sqlalchemy@googlegroups.com>.
Visit this group at http://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 http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to