SQLAlchemy + MySQL - 将表名作为原始查询中的参数传递

Cly*_*row 6 python sqlalchemy

在我的应用程序中,我使用 SQLAlchemy 和 mysql-connector-python。我想SELECT * FROM :table LIMIT 10在我的 mysql 数据库上执行这样的查询。但是我的代码不起作用

table_name = "tmp1"
QUERY = "SELECT * FROM :table LIMIT 10"
conn = create_sql_connection()
res = conn.execute(
    QUERY,
    {'table': table_name}
).fetchall()
print(res)
Run Code Online (Sandbox Code Playgroud)

我读到你不能使用表名作为参数,我应该只使用 python 字符串格式。但我真的很担心它绝对不能安全地防止 sql 注入。怎么解决呢?是否有任何实用程序可以转义我的表名变量?

Postgres 有一个解决方案 -在 psycopg2 中传递表名作为参数- 你知道在使用 mysql 时如何解决它吗?

c89*_*f64 5

您可以将用户提供的字符串传递给 Table 语句并从中构建查询:(这里我假设您从 post 请求 json 获取用户数据)

table_name_string = request.get_json().get('table')
selected_table = db.Table(table_name_string, metadata, autoload=True)
query = selected_table.select()
Run Code Online (Sandbox Code Playgroud)

如果您确实想要,此时您还可以继续使用此查询作为原始 sql 字符串

query_string = str(query)
Run Code Online (Sandbox Code Playgroud)

绝对建议进行一些输入验证或限制哪些表有效,但它是 sql 注入安全的,因为该表必须存在于元数据中,否则会抛出异常(sqlalchemy.exc.NoSuchTableError:)