hey arnar -

I cant reproduce this one with what youve given me.  If i just set up  
"jobs" and "pages" mappers (no page version stuff since its not in  
the example), and dont compile anything, the creation of the Job()  
object compiles the "jobs" mapper which properly hits the "pages"  
backref.

from sqlalchemy import *
from datetime import datetime

__meta__ = MetaData()

jobs = Table("jobs", __meta__,
                 Column("jobno", Unicode(15), primary_key=True),
                 Column("created", DateTime, nullable=False,  
default=datetime.now),
                 Column("deleted", Boolean, nullable=False,  
default=False))

class Job(object):
     pass

mapper(Job, jobs)

pages = Table("pages", __meta__,
                 Column("jobno", Unicode(15), ForeignKey 
("jobs.jobno"),primary_key=True),
                 Column("pagename", Unicode(30), primary_key=True),
                 Column("created", DateTime,  
nullable=False,default=datetime.now),
                 Column("deleted", Boolean, nullable=False,  
default=False),
                 Column("current_version", Integer))

class Page(object):
     pass

mapper(Page, pages, properties={
     'job': relation(Job, backref=backref('pages',  
cascade="all,delete-orphan")),
})

j = Job()
print j.pages


On Jun 19, 2006, at 8:45 AM, Arnar Birgisson wrote:

> Hi there,
>
> I have two tables mapped like this:
>
> jobs = Table("jobs", __meta__,
>                 Column("jobno", Unicode(15), primary_key=True),
>                 Column("created", DateTime, nullable=False,
> default=datetime.now),
>                 Column("deleted", Boolean, nullable=False,  
> default=False))
>
> class Job(object):
>
>     @constructor
>     def __init__(self, jobno=None):
>         if jobno:
>             self.jobno = jobno
>
> mapper(Job, jobs)
>
>
> pages = Table("pages", __meta__,
>                 Column("jobno", Unicode(15), ForeignKey("jobs.jobno"),
> primary_key=True),
>                 Column("pagename", Unicode(30), primary_key=True),
>                 Column("created", DateTime, nullable=False,
> default=datetime.now),
>                 Column("deleted", Boolean, nullable=False,  
> default=False),
>                 Column("current_version", Integer))
>
> class Page(object):
>
>     @constructor
>     def __init__(self, job=None, pagename=None):
>         if job:
>             self.job = job
>         if pagename:
>             self.pagename = pagename
>         self.currentversion = PageVersion(self, 1)
>
>     def addVersion(self):
>         self.currentversion = PageVersion(self,  
> self.currentversion.version+1)
>         return self.currentversion
>
> mapper(Page, pages, properties={
>     'job': relation(Job, backref=backref('pages', cascade="all,
> delete-orphan")),
>     'currentversion': relation(PageVersion,
>                     foreignkey=pages.c.current_version,
>                     primaryjoin=and_ 
> (pages.c.jobno==pageversions.c.jobno,
>                                       
> pages.c.pagename==pageversions.c.pagename,
>
> pages.c.current_version==pageversions.c.version),
>                     post_update=True),
>     'versions': relation(PageVersion, cascade="all, delete-orphan",
>                     order_by=pageversions.c.version,  
> backref='page', lazy=False)
> })
>
>
> The problem is that if I create Job instances before ever referencing
> Page, they have no "pages" property, since it's declared in the Page
> mapper.
>
> The solution would obviously be to compile my mappers manually - but
> is there a way to turn of this deferred mapper compilation behaviour?
>
> Arnar
>
>
> _______________________________________________
> Sqlalchemy-users mailing list
> Sqlalchemy-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users



_______________________________________________
Sqlalchemy-users mailing list
Sqlalchemy-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlalchemy-users

Reply via email to