Estoy usando postgres y estoy tratando de obtener esta consulta sin procesar usando la expresión SQLAlchemy, pero no puedo:
SELECT foo.id FROM foo WHERE NOT foo.id = ANY('{1,2,3}'::int[]);Lo probé con la siguiente definición de tabla:
from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class foo(Base): __tablename__ = 'foo' id = Column(Integer(), primary_key=True) name = Column(String(80), unique=True) y ejecutando lo siguiente en IPython :
In [57]: from sqlalchemy.sql.expression import any_, not_ In [58]: from sqlalchemy.dialects import postgresql In [59]: def compile_(where): ...: statement = select([foo.id, foo.name]).where(where) ...: return str(statement.compile(dialect=postgresql.dialect())) ...: In [60]: where1 = not_(foo.id == any_([1,2,3])) In [61]: compile_(where1) Out[61]: 'SELECT foo.id, foo.name \nFROM foo \nWHERE foo.id != ANY (%(param_1)s)' Como puede ver, en lugar de obtener WHERE NOT foo.id != ANY(...) obtengo WHERE foo.id != ANY(...) .
NOTAS :
Conozco IN y NOT IN , pero no puedo usarlos debido a la longitud de other que es > 32767 y esto provoca un Error de InterfaceError debido a la cantidad de argumentos de enlace.
Parece que SQLAlchemy intenta ser demasiado inteligente. Puede ser más astuto que no usando NOT :
where1 = foo.id != all_([1,2,3]))