如何在 sqlalchemy 中使用 filter_by 而不是等于?

Posted

技术标签:

【中文标题】如何在 sqlalchemy 中使用 filter_by 而不是等于?【英文标题】:How to use filter_by and not equals to in sqlalchemy? 【发布时间】:2018-11-05 20:02:46 【问题描述】:

我有一个如下定义的函数来查询数据库表

def query_from_DB(obj, **filter):

    DBSession = sessionmaker(bind=engine)
    session = DBSession()

    res = session.query(obj).filter_by(**filter)
    session.close()

    return [x for x in res] 

我使用如下请求查询表

query_from_DB(Router, sp_id="sp-10.1.10.149", connectivity="NO")

上面的结果正确返回了数据库的响应,但是当我使用查询时

query_from_DB(Router, sp_id!="sp-10.1.10.149", connectivity="NO")

我遇到了一个错误

 SyntaxError: non-keyword arg after keyword arg

为了获得结果,我可以进行哪些可能的更改?

【问题讨论】:

每次查询时创建一个sessionmaker 实例是一种反模式。您可以将DBSession = sessionmaker(bind=engine) 行移到query_from_DB 之外。见When Do I Make a sessionmaker。如果您没有预先加载任何关系,那么在使用查询返回的对象之前关闭会话也会产生问题。 【参考方案1】:

我不相信您可以在关键字参数上使用 !=

您可以使用connectivity="YES" 或使用filter sqlalchemy 函数,这样您就可以传递==!=,但是您将无法使用关键字参数。你必须像这样传递一个 SQL 表达式...... res = session.query(obj).filter_by(connectivity != "NO")

这个问题可能会有所帮助... flask sqlalchemy querying a column with not equals

【讨论】:

【参考方案2】:

您只是尝试res = session.query(obj).filter_by(connectivity <> "NO") 吗?

【讨论】:

以上是关于如何在 sqlalchemy 中使用 filter_by 而不是等于?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy中filter和filter_by的区别

SQLAlchemy学习-8.query查找之filter()和filter_by()区别

SQLAlchemy 按降序排列?

如何在没有ORM的情况下使用SQLAlchemy查询从表中删除行?

flask_sqlalchemy模糊查询

flask_sqlalchemy filter 和filter_by的区别