SQLAlchemy:动态传递架构和表名,避免SQL注入

时间:2019-06-27 02:39:58

标签: sqlalchemy

如何执行在函数中传递模式和表名的SQL查询?像下面这样?

def get(engine, schema: str, table: str):
    query = text("select * from :schema.:table")

    result = engine.connect().execute(query, schema=schema, table=table)
    return result

2 个答案:

答案 0 :(得分:0)

这里发生两件事:

  1. 避免SQL注入
  2. 使用(大概是)PostgreSQL动态设置模式

第一个问题涉及面很广,您可能想像这样SQLAlchemy + SQL Injection

看一下有关SQLAlchemy和SQL注入的较早问题。

您的第二个问题可以通过多种方式解决,尽管我建议使用SQLAlchemy文档中的以下方法:https://docs.sqlalchemy.org/en/13/dialects/postgresql.html#remote-schema-table-introspection-and-postgresql-search-path

PostgreSQL支持一个“搜索路径”命令,该命令为事务中的所有操作设置模式。

因此您的查询代码可能类似于:

qry_str = f"SET search_path TO {schema}";

或者,如果您使用SQLAlchemy声明性方法,则可以像在此问题/答案SQLAlchemy support of Postgres Schemas

中那样使用MetaData对象。

答案 1 :(得分:0)

您可以在数据库中创建现有表和模式名称的集合,并在创建查询之前根据这些值检查输入:

-- assumes we are connected to the correct *database*

SELECT table_schema, table_name 
FROM information_schema.tables;