如何执行在函数中传递模式和表名的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
答案 0 :(得分:0)
这里发生两件事:
第一个问题涉及面很广,您可能想像这样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;