On Thu, Aug 8, 2019, at 9:48 AM, Elmer de Looff wrote:
> Hi,
> 
> I'm trying to create a query to check whether a small number of given keys 
> are all present within a selection of a table. Postgres provides array 
> types/functions for this to check sub/superset properties, which seem to do 
> what I want. The query I'm trying to create is one of the following form:


thanks for the clear test case, which allows me to just make your code work. 

The ARRAY(select) is against a scalar list, so use as_scalar() so that the 
SELECT becomes a self-contained subquery:

 city_ids = sa.select([City.id]).where(City.size_code == "M").as_scalar()
 check = sa.select(
 [array([3, 10, 18]).contained_by(sa.func.array(city_ids))]
 )





> SELECT :selection <@ ARRAY(
>  SELECT id
>  FROM city
> WHERE size_code = :size_code)
> 
> Wrapping this in a text clause, adding parameters and executing it works 
> without a hitch:
> 
> raw_select = sa.text("""
>  SELECT :selection <@ ARRAY(
>  SELECT id
>  FROM city
>  WHERE size_code = :size_code)""")
> parameterized = raw_select.params(
>  selection=[3, 10, 18],
>  size_code='M')
> result = engine.execute(parameterized).scalar()
> 
> However, I'd like to avoid having textual SQL in my codebase as it's more 
> sensitive to changes in names and generally more error-prone. I'm struggling 
> converting this to a working Core expression, a spurious FROM-clause keeps 
> being generated:
> 
> city_ids = sa.select([City.id]).where(City.size_code == 'M')
> check = sa.select([
>  array([3, 10, 18]).contained_by(sa.func.array(city_ids))])
> engine.execute(check).scalar()
> 
> This results in a Syntax Error being thrown by Postgres:
> 
> sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) subquery in 
> FROM must have an alias
> LINE 4: FROM (SELECT city.id AS id 
>  ^
> HINT: For example, FROM (SELECT ...) [AS] foo.
> 
> [SQL: SELECT ARRAY[%(param_1)s, %(param_2)s, %(param_3)s] <@ array((SELECT 
> city.id 
> FROM city 
> WHERE city.size_code = %(size_code_1)s)) AS anon_1 
> FROM (SELECT city.id AS id 
> FROM city 
> WHERE city.size_code = %(size_code_1)s)]
> [parameters: {'param_1': 3, 'param_2': 10, 'param_3': 18, 'size_code_1': 'M'}]
> (Background on this error at: http://sqlalche.me/e/f405)
> 
> The problem appears to be in the "_froms" list that is non-empty on the 
> "check" query, but I can't seem to find a way of coercing SQLAlchemy into not 
> generating that.
> 
> I've attached a minimal script to reproduce the problem. The table is 
> described though will have to be created still; it need not contain any data, 
> the problem is one of SQL syntax alone.
> 

> --
>  SQLAlchemy - 
>  The Python SQL Toolkit and Object Relational Mapper
> 
> http://www.sqlalchemy.org/
> 
>  To post example code, please provide an MCVE: Minimal, Complete, and 
> Verifiable Example. See http://stackoverflow.com/help/mcve for a full 
> description.
>  --- 
>  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 view this discussion on the web visit 
> https://groups.google.com/d/msgid/sqlalchemy/8437d2b0-7189-4842-b029-e56056a9246a%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/sqlalchemy/8437d2b0-7189-4842-b029-e56056a9246a%40googlegroups.com?utm_medium=email&utm_source=footer>.
> 
> 
> *Attachments:*
>  * sqla_select_contained_by.py

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/sqlalchemy/127f2b38-0340-490d-8edf-ddb5de0cc20d%40www.fastmail.com.

Reply via email to