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.