select (select (array_agg(unwave.restw)) as restwarr from (select (unnest(w.wavelength)/(1+n.z)) as restw from mangadatadb.wavelength as w) as unwave) from mangadatadb.cube as c join mangasampledb.manga_target as m on m.pk=c.manga_target_pk join mangasampledb.manga_target_to_nsa as t on t.manga_target_pk=m.pk join mangasampledb.nsa as n on n.pk=t.nsa_pk join mangadatadb.wavelength as w on w.pk=c.wavelength_pk limit 5;
class Cube
@hybrid_property
def restwave(self):
if self.target:
redshift = self.target.NSA_objects[0].z
wave = np.array(self.wavelength.wavelength)
restwave = wave/(1+redshift)
return restwave
else:
return None
@restwave.expression
def restwave(cls):
session = db.Session()
nsaz = session.query(sampledb.NSA.z.label('z')).\
join(sampledb.MangaTargetToNSA, sampledb.MangaTarget, Cube).\
filter(Cube.mangaid == cls.mangaid).subquery('nsaz', with_labels=True)
unwave = session.query((func.unnest(Wavelength.wavelength)/(1+nsaz.c.z)).label('restw')).subquery('unwave', with_labels=True)
restwave = session.query(func.array_agg(unwave.c.restw))
return restwave
session.query(datadb.Cube.restwave).filter(datadb.Cube.mangaid=='1-113520').all()
AttributeError: 'Query' object has no attribute 'is_clause_element'
@restwave.expression
def restwave(cls):
unwave = select([(func.unnest(Wavelength.wavelength)/(1+sampledb.NSA.z)).label('restw')])
restwave = select([func.array_agg(unwave.c.restw).label('restwarr')]).select_from(
Cube.__table__.join(Wavelength.wavelength).
join(sampledb.MangaTarget).
join(sampledb.MangaTargetToNSA).
join(sampledb.NSA)
)
return restwave
In [6]: datadb.Cube.restwave
---------------------------------------------------------------------------
ArgumentError Traceback (most recent call last)
<ipython-input-6-16300d165395> in <module>()
----> 1 datadb.Cube.restwave
/Users/Brian/anaconda2/lib/python2.7/site-packages/sqlalchemy/ext/hybrid.pyc in __get__(self, instance, owner)
738 def __get__(self, instance, owner):
739 if instance is None:
--> 740 return self.expr(owner)
741 else:
742 return self.fget(instance)
/Users/Brian/Work/sdss/repo/sdss/sdss_python_module/marvin/python/sdss/internal/database/utah/mangadb/DataModelClasses.pyc in restwave(cls)
454 # unwave = select([(func.unnest(Wavelength.wavelength)/(1+sampledb.NSA.z)).label('restw')])
455 # restwave = select([func.array_agg(unwave.c.restw).label('restwarr')]).select_from(
--> 456 # Cube.__table__.join(Wavelength.wavelength).
457 # join(sampledb.MangaTarget).
458 # join(sampledb.MangaTargetToNSA).
/Users/Brian/anaconda2/lib/python2.7/site-packages/sqlalchemy/sql/selectable.pyc in join(self, right, onclause, isouter)
350 """
351
--> 352 return Join(self, right, onclause, isouter)
353
354 def outerjoin(self, right, onclause=None):
/Users/Brian/anaconda2/lib/python2.7/site-packages/sqlalchemy/sql/selectable.pyc in __init__(self, left, right, onclause, isouter)
658 """
659 self.left = _interpret_as_from(left)
--> 660 self.right = _interpret_as_from(right).self_group()
661
662 if onclause is None:
/Users/Brian/anaconda2/lib/python2.7/site-packages/sqlalchemy/sql/selectable.pyc in _interpret_as_from(element)
47 return insp.selectable
48 except AttributeError:
---> 49 raise exc.ArgumentError("FROM expression expected")
50
51
ArgumentError: FROM expression expected
class Wavelength(Base):
__tablename__ = 'wavelength'
__table_args__ = {'autoload': True, 'schema': 'mangadatadb', 'extend_existing': True}
wavelength = deferred(Column(ARRAY_D(Float, zero_indexes=True)))
class NSA(Base):
__tablename__ = 'nsa'
__table_args__ = ({'autoload': True, 'schema': 'mangasampledb'})
z = Column(Float)
class MangaTarget(Base):
__tablename__ = 'manga_target'
__table_args__ = {'autoload': True, 'schema': 'mangasampledb'}
class MangaTargetToNSA(Base):
__tablename__ = 'manga_target_to_nsa'
__table_args__ = (
ForeignKeyConstraint(['manga_target_pk'],
['mangasampledb.manga_target.pk']),
ForeignKeyConstraint(['nsa_pk'], ['mangasampledb.nsa.pk']),
{'autoload': True, 'schema': 'mangasampledb'})
class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) name = Column(String(100), nullable=False) accounts = relationship("SavingsAccount", backref="owner") @hybrid_property def balance(self): return sum(acc.balance for acc in self.accounts) @balance.expression def balance(cls): return select([func.sum(SavingsAccount.balance)]).\ where(SavingsAccount.user_id==cls.id).\ label('total_balance')
@hybrid_property
def restwave(self):
if self.target:
redshift = self.target.NSA_objects[0].z
wave = np.array(self.wavelength.wavelength)
restwave = wave/(1+redshift)
return restwave
else:
return None
@restwave.expression
def restwave(cls):
session = db.Session()
nsaz = session.query(sampledb.NSA.z.label('z')).\
join(sampledb.MangaTargetToNSA, sampledb.MangaTarget, Cube).\
filter(Cube.mangaid == cls.mangaid).subquery('nsaz', with_labels=True)
unwave = session.query((func.unnest(Wavelength.wavelength)/(1+nsaz.c.z)).label('restw')).subquery('unwave', with_labels=True)
restwave = session.query(func.array_agg(unwave.c.restw)).as_scalar()
return restwave
rwquery = session.query(datadb.Cube.restwave).filter(datadb.Cube.mangaid=='1-113520')
rw = rwquery.first()
In [24]: print rwquery
SELECT (SELECT array_agg(unwave.restw) AS array_agg_1
FROM (SELECT unnest(mangadatadb.wavelength.wavelength) / (%(z_1)s + nsaz.z) AS restw
FROM mangadatadb.wavelength, (SELECT mangasampledb.nsa.z AS z
FROM mangasampledb.nsa JOIN mangasampledb.manga_target_to_nsa ON mangasampledb.nsa.pk = mangasampledb.manga_target_to_nsa.nsa_pk JOIN mangasampledb.manga_target ON mangasampledb.manga_target.pk = mangasampledb.manga_target_to_nsa.manga_target_pk JOIN mangadatadb.cube ON mangasampledb.manga_target.pk = mangadatadb.cube.manga_target_pk
WHERE mangadatadb.cube.mangaid = mangadatadb.cube.mangaid) AS nsaz) AS unwave) AS anon_1
FROM mangadatadb.cube
WHERE mangadatadb.cube.mangaid = %(mangaid_1)s
manga=# select c.pk,c.mangaid,c.manga_target_pk, n.z, (select (array_agg(unwave.restw))[0:5] as restwave from (select (unnest(w.wavelength)/(1+n.z)) as restw from mangadatadb.wavelength as w) as unwave)
from mangadatadb.cube as c
join mangasampledb.manga_target as m on m.pk=c.manga_target_pk
join mangasampledb.manga_target_to_nsa as t on t.manga_target_pk=m.pk
join mangasampledb.nsa as n on n.pk=t.
nsa_pk
join mangadatadb.wavelength as w on w.pk=c.wavelength_pk;
pk | mangaid | manga_target_pk | z | restwave
-------+---------+-----------------+--------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
11211 | 1-22286 | 30678 | 0.099954180419445 | {3292.49709827422,3293.25529747001,3294.01371862107,3294.7723617274,3295.53100483373}
7729 | 1-22286 | 30678 | 0.099954180419445 | {3292.49709827422,3293.25529747001,3294.01371862107,3294.7723617274,3295.53100483373}
11209 | 1-22298 | 15026 | 0.0614774264395237 | {3411.84452637247,3412.63020900144,3413.41612163118,3414.2022642617,3414.98840689221}
7727 | 1-22298 | 15026 | 0.0614774264395237 | {3411.84452637247,3412.63020900144,3413.41612163118,3414.2022642617,3414.98840689221}
11219 | 1-22301 | 35 | 0.105152934789658 | {3277.00884941768,3277.76348196558,3278.51833542465,3279.27340979488,3280.02848416512}
(5 rows)
In [20]: rwquery = session.query(datadb.Cube.restwave).filter(datadb.Cube.mangaid=='1-113520')
In [21]: print rwquery
SELECT (SELECT array_agg(unwave.restw) AS array_agg_1
FROM (SELECT unnest(mangadatadb.wavelength.wavelength) / (%(z_1)s + nsaz.z) AS restw
FROM mangadatadb.wavelength, (SELECT mangasampledb.nsa.z AS z
FROM mangasampledb.nsa JOIN mangasampledb.manga_target_to_nsa ON mangasampledb.nsa.pk = mangasampledb.manga_target_to_nsa.nsa_pk JOIN mangasampledb.manga_target ON mangasampledb.manga_target.pk = mangasampledb.manga_target_to_nsa.manga_target_pk JOIN mangadatadb.cube ON mangasampledb.manga_target.pk = mangadatadb.cube.manga_target_pk
WHERE mangadatadb.cube.mangaid = mangadatadb.cube.mangaid) AS nsaz) AS unwave) AS anon_1
FROM mangadatadb.cube
WHERE mangadatadb.cube.mangaid = %(mangaid_1)s
In [22]: rwave = rwquery.first()
In [23]: rwave[0][0:10]
Out[23]:
[3292.49709827422,
3293.25529747001,
3294.01371862107,
3294.7723617274,
3295.53100483373,
3296.28986989532,
3297.04895691218,
3297.80826588431,
3298.56779681171,
3299.32732773911]
@restwave.expression
def restwave(cls):
session = db.Session()
nsaz = session.query(sampledb.NSA.z.label('z')).\
join(sampledb.MangaTargetToNSA, sampledb.MangaTarget, Cube).\
filter(Cube.mangaid == cls.mangaid).subquery('nsaz', with_labels=True)
unwave = session.query((func.unnest(Wavelength.wavelength)/(1+nsaz.c.z)).label('restw')).subquery('unwave', with_labels=True)
restwave = session.query(func.array_agg(unwave.c.restw)).as_scalar()
return restwave
@restwave.expression
def restwave(cls):
s = db.Session()
restw = (func.unnest(Wavelength.wavelength) / (1 + sampledb.NSA.z)).label("restw")
unwave = s.query(restw).select_from(Wavelength).correlate(sampledb.NSA).subquery("unwave")
agg_unwave = s.query(func.array_agg(unwave.c.restw)).label("restwarr")
joined = s.query(agg_unwave).select_from(
Cube
).join(sampledb.MangaTarget, sampledb.MangaTargetToNSA, sampledb.NSA, Wavelength)
return joined.as_scalar()
session.query(datadb.Cube.restwave).filter(datadb.Cube.mangaid=='1-113520').all()
ProgrammingError: (psycopg2.ProgrammingError) more than one row returned by a subquery used as an expression
[SQL: 'SELECT (SELECT (SELECT array_agg(unwave.restw) AS array_agg_1 \nFROM (SELECT unnest(mangadatadb.wavelength.wavelength) / (%(z_1)s + mangasampledb.nsa.z) AS restw \nFROM mangadatadb.wavelength) AS unwave) AS restwarr \nFROM mangadatadb.cube JOIN mangasampledb.manga_target ON mangasampledb.manga_target.pk = mangadatadb.cube.manga_target_pk JOIN mangasampledb.manga_target_to_nsa ON mangasampledb.manga_target.pk = mangasampledb.manga_target_to_nsa.manga_target_pk JOIN mangasampledb.nsa ON mangasampledb.nsa.pk = mangasampledb.manga_target_to_nsa.nsa_pk JOIN mangadatadb.wavelength ON mangadatadb.wavelength.pk = mangadatadb.cube.wavelength_pk) AS anon_1 \nFROM mangadatadb.cube \nWHERE mangadatadb.cube.mangaid = %(mangaid_1)s'] [parameters: {'z_1': 1, 'mangaid_1': '1-113520'}]
session.query(datadb.Cube.restwave).join(datadb.Cube,datadb.PipelineInfo,datadb.PipelineVersion).filter(datadb.PipelineVersion=='v1_5_1',datadb.Cube.mangaid=='1-113520').all()
InvalidRequestError: Could not find a FROM clause to join from. Tried joining to <class 'sdss.internal.database.utah.mangadb.DataModelClasses.Cube'>, but got: Can't find any foreign key relationships between 'nsa' and 'cube'.
I've yet to see an unambiguous statement of what "the raw SQL" is. If
it is this:
select c.pk,c.mangaid,c.manga_target_pk, n.z,
(select (array_agg(unwave.restw))[0:5] as restwave from (select
(unnest(w.wavelength)/(1+n.z)) as restw from mangadatadb.wavelength as
w) as unwave)
from mangadatadb.cube as c
join mangasampledb.manga_target as m on m.pk=c.manga_target_pk
join mangasampledb.manga_target_to_nsa as t on t.manga_target_pk=m.pk
join mangasampledb.nsa as n on n.pk=t.nsa_pk
join mangadatadb.wavelength as w on w.pk=c.wavelength_pk;
then that does not, and cannot, correspond to the Python code you are
sending. the JOINs would not be inside of the @expression, you'd have
to write them out on the outside.
I've provided a complete example of how to render SQL extremely similar
to what you want, featuring techniques such as correlate() as well as
how to nest the queries appropriately. If at this point you aren't able
to manipulate the code to get what you want, then I'd advise not using a
hybrid for this query at all. It is extremely complicated in this
context, and unless you are deeply familiar with SQLAlchemy APIs, you
would just have a bunch of code that you can't effectively maintain.