【问题标题】:Build full query from SQLAlchemy orm从 SQLAlchemy orm 构建完整查询
【发布时间】:2020-12-06 22:06:31
【问题描述】:

最终我尝试使用接收原始 SQL 查询的 pandas read_sql。

我正在尝试转换类似的东西;

sql = str(session.query(Post).filter(Post.user_id=1))

这会产生类似的东西

select * from Post where user_id = %(user_id_1)

有没有什么方法可以生成带有已插入参数的查询?

【问题讨论】:

  • 您可以尝试将该 SQL 字符串与params={"user_id_1": 1} 一起直接传递给read_sql_query。这将帮助您避免将文字值注入 SQL 命令文本的混乱。
  • 是的,这就是我现在正在做的事情。似乎应该有一种方法可以使用 SQLAlchemy 自动执行此操作

标签: python sql sqlalchemy


【解决方案1】:

如您所见,如果我们 str() 一个 ORM 查询,我们会使用我们方言的 paramstyle 获得带有参数占位符的 SQL 命令文本:

qry = session.query(Parent).filter(Parent.id == 1)
sql = str(qry)
print(sql)
"""console output:
SELECT parent.id AS parent_id, parent.lastname AS parent_lastname, parent.firstname AS parent_firstname 
FROM parent 
WHERE parent.id = %(id_1)s
"""

如果我们想在 SQL 语句中嵌入参数值,那么我们需要.compile()它:

sql_literal = qry.statement.compile(
    compile_kwargs={"literal_binds": True},
)
print(sql_literal)
"""console output:
SELECT parent.id, parent.lastname, parent.firstname 
FROM parent 
WHERE parent.id = 1
"""

(适用于 SQL 注入的标准免责声明。)

【讨论】:

    猜你喜欢
    • 2020-07-20
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多