On 7/26/15 12:56 PM, Dennis Ljungmark wrote:
Hello, all.

I am trying to reshape the (somewhat tricky) SQL query below into something SQLAlchemy can generate, and I just hit a wall:

This is the query:
SELECT (c).csr_id, (c).not_before, (c).not_after FROM (SELECT (SELECT c FROM certificate c WHERE c.csr_id=csr.id ORDER BY c.not_after DESC LIMIT 1) AS c FROM csr offset 0) s;

And, I just can't seem to get SQLAlchemy to emit a correlated scalar subquery like this.
correlated scalar subqueries are illustrated in the Core tutorial at http://docs.sqlalchemy.org/en/rel_1_0/core/tutorial.html#scalar-selects. I'm not sure why inklesspen's example isn't making use of as_scalar() or stmt.label(), which would be required. Query supports the same use if you are working with ORM queries.

However, the statement "SELECT c FROM certificate c" and the "(c).csr_id" syntax appears to be using a very unusual postgresql-specific syntax which is rolling the whole inner row into a single-column tuple and then referencing it that way, which is odd because the row itself is already a tuple, not sure what forcing it into a tuple that contains exactly one tuple accomplishes here.

While we can certainly use tuple_() and probably create some extra custom constructs around it to support this syntax, I see nothing in this specific statement to justify the use of these syntaxes, nor the need to produce correlated scalar subqueries when we just are looking for one row from the "certificate" table. I don't at the moment see why you can't use this statement, which is easier to read, platform agnostic, and way more efficient:

SELECT c.csr_id, c.not_before, c.not_after FROM certificate AS c JOIN csr ON csr.id = c.csr_id ORDER BY c.not_after DESC LIMIT 1










There ought to be something, but for the life of me I can't seem to make it happen.

InklessPen tried to help me on IRC, and we got something, but it's still not quite the same,
 https://gist.github.com/inklesspen/49e69e1f33f3852d348a

A reduced model is below,


class CSR(Base):
    certificates = _orm.relationship("Certificate", backref="csr")

class Certificate(Base):
    not_before = _sa.Column(_sa.DateTime, nullable=False)
    not_after = _sa.Column(_sa.DateTime, nullable=False)
    csr_id = _fkcolumn(CSR.id, nullable=False)


Regards,
  D.S.

--
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] <mailto:[email protected]>. To post to this group, send email to [email protected] <mailto:[email protected]>.
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 [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.

Reply via email to