如何指定多个"where"或"order_by"条件?
How to specify multiple "where" or "order_by" conditions?
很难直接找到这方面的信息,所以想知道是否有一些我可以查看的文档,但基本上我想实现将多个条件传递给安全的 .where()
或 .order_by()
来自 SQL 注入。
这是我目前的做法:两个表:存档和备份,我正在尝试按 archive.city
、archive.zip
和 backup.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
"""
很难直接找到这方面的信息,所以想知道是否有一些我可以查看的文档,但基本上我想实现将多个条件传递给安全的 .where()
或 .order_by()
来自 SQL 注入。
这是我目前的做法:两个表:存档和备份,我正在尝试按 archive.city
、archive.zip
和 backup.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
"""