我正在使用postgres,并试图使用SQLAlchemy表达式获取这个原始查询,但我无法:
SELECT foo.id FROM foo WHERE NOT foo.id = ANY('{1,2,3}'::int[]);我用下表定义对它进行了测试:
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)并在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)'如您所见,我没有获得WHERE NOT foo.id != ANY(...),而是得到了WHERE foo.id != ANY(...)。
注意到
我知道IN和NOT IN,但由于other的长度(即> 32767 ),不能使用它们,这会导致一个InterfaceError,这是由于绑定参数的数量。
发布于 2020-07-17 11:28:37
看来SQLAlchemy太聪明了。您可以在不使用NOT的情况下胜过它
where1 = foo.id != all_([1,2,3]))https://stackoverflow.com/questions/62952771
复制相似问题