[sqlalchemy] Re: column_property with load_only and inheritance

2015-11-05 Thread Mattias Lagergren
Hi again Mike, or anyone else who has some good advice. 

I've tried a similar setup but with a relation to a sub-class to context 
and it seems that it doesn't have this problem when using joinedload. Any 
hints on how to further debug this issue would be helpful

Thanks!
Mattias L

On Tuesday, November 3, 2015 at 3:32:02 PM UTC+1, Mattias Lagergren wrote:
>
> Hi Michael,
>
> I've been putting together a self-contained example. If you save it to a 
> file test_model you should be able to run it:
>
>
> import sqlalchemy
> import sqlalchemy.orm
> import sqlalchemy.inspection
> import sqlalchemy.ext.declarative
>
> DATABASE_URL = 
>
> Base = sqlalchemy.ext.declarative.declarative_base()
>
>
> class Context(Base):
> '''Represent a context.'''
>
> context_type = sqlalchemy.Column(
> sqlalchemy.types.Unicode(32), nullable=False
> )
>
> __mapper_args__ = {
> 'polymorphic_on': context_type,
> 'polymorphic_identity': 'context'
> }
>
> __tablename__ = 'context'
>
> name = sqlalchemy.Column(
> sqlalchemy.types.Unicode(255), default=u'', nullable=False
> )
>
> id = sqlalchemy.Column(
> sqlalchemy.types.CHAR(36), primary_key=True
> )
>
> @classmethod
> def __declare_last__(cls):
> '''Return link expression query.'''
>
> # Import this module.
> import test_model as context
> context = sqlalchemy.orm.aliased(context.Context.__table__)
>
> # My real use-case is more complicated and involves a lot of 
> joinst to
> # other tables, but this example reproduces the issue.
> cls.link = sqlalchemy.orm.column_property(
> sqlalchemy.select(
> [context.c.name + ' ' + context.c.context_type],
> from_obj=[context]
> ).where(
> context.c.id == cls.id
> ).label('link')
> )
>
>
> class Task(Context):
> '''Represent a task.'''
>
> __tablename__ = 'task'
>
> __mapper_args__ = {
> 'polymorphic_identity': 'task'
> }
>
> taskid = sqlalchemy.Column(
> sqlalchemy.types.CHAR(36),
> sqlalchemy.ForeignKey('context.id'),
> primary_key=True
> )
>
>
> class Asset(Base):
> '''Represent an Asset.'''
>
> __tablename__ = 'asset'
>
> assetid = sqlalchemy.Column(
> sqlalchemy.types.CHAR(36), primary_key=True
> )
>
> context_id = sqlalchemy.Column(
> sqlalchemy.CHAR(36), sqlalchemy.ForeignKey('context.id')
> )
>
> parent = sqlalchemy.orm.relationship(
> 'Context'
> )
>
>
> if __name__ == '__main__':
> print 'Loaded attributes: '
>
> # Create engine.
> engine = sqlalchemy.create_engine(
> DATABASE_URL
> )
> Session = sqlalchemy.orm.sessionmaker(bind=engine)
> session = Session()
>
> entity = session.query(
> Asset
> ).options(
> sqlalchemy.orm.joinedload('parent')
> ).first()
>
> state = sqlalchemy.inspection.inspect(entity.parent)
> for attribute in state.attrs:
> is_loaded = (
> attribute.loaded_value is not
> sqlalchemy.orm.base.NO_VALUE
> )
> if is_loaded:
> print attribute.key
>
>
>
>
>
> On Monday, November 2, 2015 at 3:16:07 PM UTC+1, Mattias Lagergren wrote:
>
> Hi,
>
> I'm trying to use load_only and joinedload on a relationship 
> model.Asset.parent. The parent relation is polymorphic and can be either 
> Task or Project with the common Base class called Context.
>
> import sqlalchemy.orm
> import sqlalchemy.inspection
>
> entity = model.session.query(
> model.Asset
> ).options(
> sqlalchemy.orm.joinedload('parent').load_only(
> 'context_type', 'name', 'link'
> )
> ).first()
>
> state = sqlalchemy.inspection.inspect(entity.parent)
> for attribute in state.attrs:
> is_loaded = (
> attribute.loaded_value is not
> sqlalchemy.orm.base.NO_VALUE
> )
> if is_loaded:
> print attribute.key
>
> # Output:
> id
> taskid
> name
> context_type
>
>
> The id, name and context_type is from Context. And taskid is primary key 
> on the taskid and is a foreignkey to the context.id. As you can see 
> "name" loads fine but "link" attribute is not loaded. The "link" column is 
> added as a column_property to Context using a __declare_last__. 
>
> These are simplified versions of the classes:
>
>
> class Context(Base):
> '''Represent a context.'''
> context_type = Column(Unicode(32), nullable=False)
> 
> __mapper_args__ = {
> 'polymorphic_on': context_type,
> 'polymorphic_identity': 'context'
> }
>
> name = Column(Unicode(255), default=u'', nullable=False)
>
> @declared_attr
> def id(cls):
> return Column(CHAR(36), primary_key=True, default=lambda: str(uuid

Re: [sqlalchemy] Re: column_property with load_only and inheritance

2015-11-05 Thread Mike Bayer



On 11/03/2015 07:32 AM, Mattias Lagergren wrote:

Hi Michael,

I've been putting together a self-contained example. If you save it to a
file test_model you should be able to run it:



what's the SQL output with echo=True on the engine?  is the subquery for 
context rendered in the SQL and is it correct?


What happens if you load just a Context object by itself?


the example here isn't exactly "self contained" because it loads data 
that's not there.  Also there's no need to "import test_model", "cls", 
right there is the Context object.


What happens if you run the example using no inheritance at all?

It might be possible that __declare_last__() isn't appropriate here, can 
you try just saying "Context.link = column_property()"... right after 
you declare Context?






|

importsqlalchemy
importsqlalchemy.orm
importsqlalchemy.inspection
importsqlalchemy.ext.declarative

DATABASE_URL =

Base=sqlalchemy.ext.declarative.declarative_base()


classContext(Base):
'''Represent a context.'''

 context_type =sqlalchemy.Column(
 sqlalchemy.types.Unicode(32),nullable=False
)

 __mapper_args__ ={
'polymorphic_on':context_type,
'polymorphic_identity':'context'
}

 __tablename__ ='context'

 name =sqlalchemy.Column(
 sqlalchemy.types.Unicode(255),default=u'',nullable=False
)

 id =sqlalchemy.Column(
 sqlalchemy.types.CHAR(36),primary_key=True
)

@classmethod
def__declare_last__(cls):
'''Return link expression query.'''

# Import this module.
importtest_model ascontext
 context =sqlalchemy.orm.aliased(context.Context.__table__)

# My real use-case is more complicated and involves a lot of joinst to
# other tables, but this example reproduces the issue.
 cls.link =sqlalchemy.orm.column_property(
 sqlalchemy.select(
[context.c.name +' '+context.c.context_type],
 from_obj=[context]
).where(
 context.c.id ==cls.id
).label('link')
)


classTask(Context):
'''Represent a task.'''

 __tablename__ ='task'

 __mapper_args__ ={
'polymorphic_identity':'task'
}

 taskid =sqlalchemy.Column(
 sqlalchemy.types.CHAR(36),
 sqlalchemy.ForeignKey('context.id'),
 primary_key=True
)


classAsset(Base):
'''Represent an Asset.'''

 __tablename__ ='asset'

 assetid =sqlalchemy.Column(
 sqlalchemy.types.CHAR(36),primary_key=True
)

 context_id =sqlalchemy.Column(
 sqlalchemy.CHAR(36),sqlalchemy.ForeignKey('context.id')
)

 parent =sqlalchemy.orm.relationship(
'Context'
)


if__name__ =='__main__':
print'Loaded attributes: '

# Create engine.
 engine =sqlalchemy.create_engine(
 DATABASE_URL
)
Session=sqlalchemy.orm.sessionmaker(bind=engine)
 session =Session()

 entity =session.query(
Asset
).options(
 sqlalchemy.orm.joinedload('parent')
).first()

 state =sqlalchemy.inspection.inspect(entity.parent)
forattribute instate.attrs:
 is_loaded =(
 attribute.loaded_value isnot
 sqlalchemy.orm.base.NO_VALUE
)
ifis_loaded:
printattribute.key

|




On Monday, November 2, 2015 at 3:16:07 PM UTC+1, Mattias Lagergren wrote:

Hi,

I'm trying to use load_only and joinedload on a relationship
model.Asset.parent. The parent relation is polymorphic and can be
either Task or Project with the common Base class called Context.

|
importsqlalchemy.orm
importsqlalchemy.inspection

 entity =model.session.query(
 model.Asset
).options(
 sqlalchemy.orm.joinedload('parent').load_only(
'context_type','name','link'
)
).first()

 state =sqlalchemy.inspection.inspect(entity.parent)
forattribute instate.attrs:
 is_loaded =(
 attribute.loaded_value isnot
 sqlalchemy.orm.base.NO_VALUE
)
ifis_loaded:
printattribute.key

# Output:
id
taskid
name
context_type

|

The id, name and context_type is from Context. And taskid is primary
key on the taskid and is a foreignkey to the context.id
. As you can see "name" loads fine but "link"
attribute is not loaded. The "link" column is added as a
column_property to Context using a __declare_last__.

These are simplified versions of the classes:

|

classContext(Base):
'''Represent a context.'''
 context_type =Column(Unicode(32),nullable=False)

 __mapper_args__ ={
'polymorphic_on':context_type,
'polymorphic_identity':'context'
}

 name =Column(Unicode(255),default=u'',nullable=False)

@declared_attr
defid(cls):
returnColumn(CHAR(36),primary_key=True,default=lambda:str(uuid()))

@classmethod
def__declare_last__(cls):
'''Return link expression query.'''

...

 cls.link =column_property(
 sqlalchemy.type_coerce(
 query,LinkTypeDecorator

Re: [sqlalchemy] SQLAlchemy: Database Access Using Python - Developer's Library book

2015-11-05 Thread Mike Bayer



On 11/03/2015 06:55 PM, Ken Lareau wrote:

I came across this during a search, and in the four different sites
I've checked, I've seen four different release dates varying from
2008 to 2018, for example:

http://www.amazon.com/SQLAlchemy-Database-Access-Developers-Library/dp/0132364670

(which has 2018 for the release date).  So I'm curious...

Is this a very old book (2008) or a book that has several years
to be released (2018)?  Does anyone actually know which of
the various dates are most likely correct? :)  (I've seen a few
around May-June of 2016, which seems the most likely, but...)

Given one of the authors of the book, I'm hoping I might be able
to find out more here. :)



it's unfortunately a non-existent book for the time being and I'm not 
able to make any predictions when that might change.




--
Ken Lareau

--
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.


--
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.