如何指定多个"where"或"order_by"条件?

How to specify multiple "where" or "order_by" conditions?

很难直接找到这方面的信息,所以想知道是否有一些我可以查看的文档,但基本上我想实现将多个条件传递给安全的 .where().order_by()来自 SQL 注入。

这是我目前的做法:两个表:存档和备份,我正在尝试按 archive.cityarchive.zipbackup.serial 进行过滤,然后我正在订购通过所有这些领域。这些值是通过 URL 参数来自用户的,因此我需要确保这些值不会受到 SQL 注入和消毒。

filters = []
sorts = []

    if 'city' in query:
            city = query['city']
            filters.append(text(f'archive.city = {city}')) 
            sorts.append(text(f'archive.city = {city}')) 

    if 'zip' in query:
            zip = query['zip']
            filters.append(text(f'archive.zip > {zip}'))    
            sorts.append(text(f'archive.zip DESC'))  

    if 'serial' in query:
            serial = query['serial']
            filters.append(text(f'backup.serial IN {serial}'))    
            sorts.append(text(f'backup.serial ASC')) 

    with Session(engine) as session:
        results = session.exec(select(Archive, Backup)
                               .join(Backup)
                               .where(and_(*filters))
                               .order_by(*sorts).all()

据我所知,text() 不能安全地进行 sql 注入,那么我该如何转换它,以便它可以执行我想要的操作并且可以安全地进行 sql 注入?

您可以在 select() 上多次调用 .where().order_by(),SQLAlchemy 会在逻辑上为您“与”它们:

qry = select(Task)
qry = qry.where(Task.description == "foo")
qry = qry.where(Task.priority < 2)
qry = qry.order_by(Task.priority)
qry = qry.order_by(Task.description)

print(qry)
"""
SELECT task.id, task.description, task.priority 
FROM task 
WHERE task.description = :description_1 AND task.priority < :priority_1 
ORDER BY task.priority, task.description
"""