sorry, i have copy-and-paste incomplete parts of my real model definitions.

run the attached file and you will see the exception....

sqlalchemy.exc.InterfaceError: (InterfaceError) Error binding parameter 0 - 
probably unsupported type. u'SELECT (SELECT 
sum(nestingsheetlayoutitem.quantity) AS sum_1 \nFROM 
nestingsheetlayoutitem, nestingsheetlayout \nWHERE 
nestingsheetlayout.project_id = ? AND jobitem.part_id = 
nestingsheetlayoutitem.part_id) AS anon_1, (SELECT job.project_id \nFROM 
job \nWHERE job.id = jobitem.job_id) AS anon_2, jobitem.id AS jobitem_id, 
jobitem.job_id AS jobitem_job_id, jobitem.quantity AS jobitem_quantity, 
jobitem.part_id AS jobitem_part_id \nFROM jobitem' (<ColumnProperty at 
0x935c48c; no key>,)


On Sunday, June 1, 2014 1:47:06 AM UTC+3, Michael Bayer wrote:
>
> your example is incomplete in that it is missing named columns such as 
> “part_id” and such, but when I fill those in I’m able to form a SELECT 
> using the properties you refer to:
>
> SELECT (SELECT sum(nestingsheetlayoutitem.quantity) AS sum_1 
> FROM nestingsheetlayoutitem, nestingsheetlayout 
> WHERE nestingsheetlayout.project_id = :project_id_1 AND jobitem.part_id = 
> nestingsheetlayoutitem.part_id) AS anon_1, (SELECT job.project_id 
> FROM job 
> WHERE job.id = jobitem.job_id) AS anon_2, jobitem.id AS jobitem_id, 
> jobitem.job_id AS jobitem_job_id, jobitem.quantity AS jobitem_quantity, 
> jobitem.part_id AS jobitem_part_id 
> FROM jobitem
>
>
> I can see that this query has problems, such as that your column property 
> isn’t equating nestingsheetlayoutitem and nestingsheetlayout to each other 
> and you might be getting too many rows back, but the query is representing 
> as close as I can tell what you’re asking it to render.   The subqueries 
> correlate to job_item on the outside, and sometimes there’s extra things 
> needed to make these correlations work out OK but here they seem to be 
> unambiguous.
>
> please work with the attached to show more specifically the part that is 
> not working.    I will note that column_property does have some 
> configurational limitations within declarative, in that if you wanted to 
> refer to a column_property attached to JobItem directly you have to jump 
> through some extra hoops at the moment, there’s plans to get column_props 
> to be more flexible within declarative.   But the mapping here doesn’t seem 
> to be running into those.
>
>

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base, declared_attr

Base = declarative_base()

class Project(Base):
    __tablename__ = 'project'
    id = Column(Integer, autoincrement=True, primary_key=True)

class NestingSheetLayout(Base):
    __tablename__ = 'nestingsheetlayout'

    id = Column(Integer, autoincrement=True, primary_key=True)

    project_id = Column(None, ForeignKey(Project.id, ondelete='CASCADE'))
    project = relationship(Project,
        backref=backref('nesting_sheet_layouts',
            cascade='all,delete-orphan', passive_deletes=True))

class NestingSheetLayoutItem(Base):
    __tablename__ = 'nestingsheetlayoutitem'

    id = Column(Integer, autoincrement=True, primary_key=True)

    part_id = Column(Integer)
    quantity = Column(Integer)

    nesting_sheet_layout_id = Column(None, ForeignKey(NestingSheetLayout.id, ondelete='CASCADE'))
    nesting_sheet_layout = relationship(NestingSheetLayout,
        backref=backref('items', cascade='all,delete-orphan', passive_deletes=True))

    @declared_attr
    def project_id(cls):
        return column_property(
            select(
                [NestingSheetLayout.project_id],
                NestingSheetLayout.id==cls.nesting_sheet_layout_id
            ),
        )

class Job(Base):
    __tablename__ = 'job'

    id = Column(Integer, autoincrement=True, primary_key=True)

    project_id = Column(None, ForeignKey(Project.id))
    project = relationship(Project,
        backref=backref('jobs', cascade='all, delete-orphan'))


class JobItem(Base):
    __tablename__ = 'jobitem'

    id = Column(Integer, autoincrement=True, primary_key=True)

    job_id = Column(None, ForeignKey(Job.id, ondelete='CASCADE'))
    job = relationship(Job, lazy=True,
        backref=backref('items', cascade='all', passive_deletes=True))

    quantity = Column(Integer)
    part_id = Column(Integer)

    @declared_attr
    def project_id(cls):
        return column_property(
            select([Job.project_id], Job.id==cls.job_id),
        )

    @declared_attr
    def nested_quantity(cls):
        return column_property(
            select(
                [func.sum(NestingSheetLayoutItem.quantity)],
                (
                    (cls.project_id==NestingSheetLayout.project_id) &
                    (cls.part_id == NestingSheetLayoutItem.part_id)
                )
            )
        )

s = Session()
s.bind = engine = create_engine('sqlite:///')
Base.metadata.create_all(engine)
print s.query(JobItem).all()

Reply via email to