首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLAlchemy -如何否定任何表达式

SQLAlchemy -如何否定任何表达式
EN

Stack Overflow用户
提问于 2020-07-17 11:10:45
回答 1查看 127关注 0票数 2

我正在使用postgres,并试图使用SQLAlchemy表达式获取这个原始查询,但我无法:

代码语言:javascript
复制
SELECT foo.id FROM foo WHERE NOT foo.id = ANY('{1,2,3}'::int[]);

我用下表定义对它进行了测试:

代码语言:javascript
复制
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中运行以下内容

代码语言:javascript
复制
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(...)

注意到

我知道INNOT IN,但由于other的长度(即> 32767 ),不能使用它们,这会导致一个InterfaceError,这是由于绑定参数的数量。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-17 11:28:37

看来SQLAlchemy太聪明了。您可以在不使用NOT的情况下胜过它

代码语言:javascript
复制
where1 = foo.id != all_([1,2,3]))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62952771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档