首页 > 编程问答 >sqlalchemy动态过滤

sqlalchemy动态过滤

时间:2024-07-24 08:36:38浏览次数:9  
标签:python dynamic sqlalchemy filtering

我正在尝试使用 SQLAlchemy ORM 实现动态过滤。

我在浏览 StackOverflow 时发现了非常相似的问题: SQLALchemy 动态 filter_by

这对我很有用,但还不够。

所以,在这里是一些代码示例,我正在尝试编写:

# engine - MySQL engine
session_maker = sessionmaker(bind=engine)
session = session_maker()

# my custom model
model = User

def get_query(session, filters):
    if type(filters) == tuple:
        query = session.query(model).filter(*filters)
    elif type(filters) == dict:
        query = session.query(model).filter(**filters)
    return query

然后我尝试将其与非常相似的内容重用:

filters = (User.name == 'Johny')
get_query(s, filters) # it works just fine

filters = {'name': 'Johny'}
get_query(s, filters)

第二次运行后,出现了一些问题:

TypeError: filter() got an unexpected keyword argument 'name'

当我尝试时将我的 filters 更改为:

filters = {User.name: 'Johny'}

它返回:

TypeError: filter() keywords must be strings

但它对于手动查询工作正常:

s.query(User).filter(User.name == 'Johny')

我的过滤器出了什么问题?

顺便说一句,看起来它对于情况工作正常:| ||但是按照上述帖子的建议,我尝试仅使用

filters = {'name':'Johny'}
s.query(User).filter_by(**filters)

filter 如果只有一种可能使用

而不是 filter_by ,这两种方法之间有什么区别吗? filter , is there any differences between these two methods?


在尝试使用字典解包来构建 SQLAlchemy 查询过滤器时遇到了问题。SQLAlchemy 的 filter 方法被设计为接受关键字参数,其中关键字是列名(作为字符串),值是过滤条件。

以下是的代码中出现错误的原因以及如何更正它的说明:

错误分析

  • TypeError: filter() got an unexpected keyword argument 'name'

当传递 filters = {'name': 'Johny'} 并使用 filter(**filters) 时,Python 会尝试将字典解包为关键字参数。在这种情况下,它等效于调用 filter(name='Johny') 。但是, filter 方法期望列名作为关键字参数的字符串,而不是 'name' 本身。

  • TypeError: filter() keywords must be strings

当传递 filters = {User.name: 'Johny'} 时,使用的是列对象 ( User.name ) 作为关键字,这在 filter 方法中是不允许的。

解决方案

为了解决这个问题,需要在使用字典解包之前构建一个包含正确关键字参数的字典:

def get_query(session, model, filters):
    if isinstance(filters, dict):
        # 将字典键转换为字符串列名
        filters = {str(column.name): value for column, value in filters.items()}
        query = session.query(model).filter_by(**filters)
    elif isinstance(filters, tuple):
        query = session.query(model).filter(*filters)
    else:
        raise ValueError("Invalid filters type. Must be dict or tuple.")
    return query

# 使用示例
filters = {User.name: 'Johny'} 
get_query(session, User, filters)

filter filter_by

  • filter() : 用于更复杂和动态的条件,接受 SQLAlchemy 表达式语言中的条件。可以使用比较运算符、逻辑运算符 ( AND , OR , NOT )、 LIKE IN 等。

  • filter_by() : 是 filter() 的简化版本,用于简单的相等比较。它接受关键字参数,其中关键字是列名(作为字符串),值是用于相等比较的值。

总结

通过在使用字典解包之前正确格式化过滤器字典,可以使用 filter filter_by 方法轻松地构建动态 SQLAlchemy 查询。选择哪种方法取决于需要的查询复杂度。

标签:python,dynamic,sqlalchemy,filtering
From: 41305129

相关文章

  • 使用python,如何创建重复的工作时间表
    这是我们公司的小组工作安排表。为三班制,2组日夜工作,1组休息。重复白天工作4天休息2天,然后再次夜间工作4天休息2天的时间表。我想使用python(pandas)自动安排在8月9日之后。抱歉英语不好,提前感谢您的帮助以下是使用Python和Pandas创建重复工作时间表的代码......
  • venv 已激活,但 pip 安装仍然默认进行,并且 python 在源代码中看不到该库
    在终端shell中的vscode中输入“whichpython”显示默认路径:C:\Users\erjan\AppData\Local\Programs\Python\Python311\python.exe(my_venv)但是(my_venv)意味着我的venv处于活动状态,我做了pipinstalltransformers,但下面的代码仍然显示错误-无法看到......
  • 在Python多处理中执行二进制信号量或互斥体以进行上下文切换操作
    我正在尝试自动化win应用程序和java应用程序之间的同步关系。我的标准是:启动win和jav应用程序在jav应用程序中执行命令等待jav应用程序的响应使用jav应用程序的响应到Windows应用程序作为输入。在jav应用程序中执行命令win应用程序......
  • 在spyder-python上随机出现的这些奇怪的亮点是什么
    在此处输入图像描述每次我单击此按钮或进行任何更改时,都会创建奇怪的突出显示,当我最小化功能时更是如此。有什么建议如何摆脱这些或可能的原因是什么?谢谢!我尝试更改外观首选项中的设置,但无法影响问题。很抱歉,我无法直接查看或与Spyder界面交互。我是一个AI......
  • 比较Python字典并找到缺失的元素
    我遇到了一个问题,我已经尝试了几天但没有得到任何结果。我想比较两个字典,在一个字典中有“赛前”足球比赛,在第二个字典中有“现场”足球比赛。我想将它们相互比较并打印它们(如果有)没有赛前比赛直播。示例1pre=[{"Home":"Genoa","Away":"In......
  • SQLAlchemy AttributeError:“表”对象在以前运行的模型中没有属性“id”
    我有一个烧瓶应用程序工厂应用程序,其中包含大量模型和视图。一切都工作正常,直到我将某些模块更改为backref以跟上时代的步伐。突然,应用程序无法工作,因为我在不同的模块中收到sqlalchemy属性错误,甚至在用户模块中,而这些模块根本没有被触及。(见下文。)back_populat......
  • Python使用Visual Studio打印功能不显示输出
    任务:检查一个整数是正数还是负数。检查整数是否能被2整除。当输入0时,我需要退出循环并报告每个计数和总和。print函数没有显示任何输出。这是我从defmain()开始使用的代码defmain():countpositive=0countnegative=0count_divisible_by_2=0sump......
  • Python 中的像素最小二乘法
    我有一个非线性前向模型,它计算每个像素参数w的灰度图像。我还可以使用scipys优化函数来反转模型。我目前遇到的唯一问题是图像的大小使得这个解决方案非常慢...比如7%的像素在40分钟内计算得很慢。我使用for循环遍历所有像素并按像素应用模型。我尝试过......
  • SQL 命令在手动运行时工作正常(SQL Developer),但在 Python 的 oracledb 模块中给出 ORA-
    我正在使用OracleSQL数据库,并且我想运行该命令ALTERSESSIONSETNLS_DATE_FORMAT='YYYY-MM-DD';当我从SQLDeveloper应用程序手动运行它时,它工作正常。但是,当我使用oracledb模块从Python运行它时,出现以下错误:ErrorrunningSQLscript:ORA-00922:mi......
  • 在pip包中分发pythonnet dll类型信息
    我已经能够使用C#通过以下方式加载pythonnetdll:fromimportlib.resourcesimportpathimportsys#Assuming'my_package.lib'isthesub-packagecontainingtheDLLswithpath('pyrp.lib','')aslib_path:sys.path.append......