当前位置: 首页 > 知识库问答 >
问题:

使用SQLAlchemy执行查询时避免参数绑定

赫连心思
2023-03-14

我正在使用SQLALchemy对Teradata执行查询。我执行的查询之一是替换存储过程的DDL语句:

REPLACE PROCEDURE DEV_MIGRATION_TOOL.UNIT_TEST_NEW_STORED_PROCEDURE()
UNIT_TEST_NEW_STORED_PROCEDURE:
BEGIN
    DECLARE V_VAR VARCHAR(50);
    SELECT 'Hello World!'
    INTO :V_VAR;
END;

此SQL语句被分配给变量query,并由SQLALchemy使用会话执行方法执行:

def execute_sql_statement(self, query):
    """Generic method to execute a SQL statement on target environment."""
    self.target_environment.db_session.execute(query)
    self.target_environment.db_session.commit()

问题是SQLAlchemy假设:v_var变量是一个应该随字典一起提供的参数。请参阅以下文档:http://docs.sqlalchemy.org/en/latest/orm/session_api.html#sqlalchemy.orm.session.session.execute

result = session.execute("SELECT * FROM user WHERE id=:param", {"param":5})

在当前配置中,它会触发错误消息

2018-04-18 19:09:27,874-migration_script-info-UAT环境上执行对象DDL语句。2018-04-18 19:09:27,875-migration_script-ERROR-(SqlAlchemy.exc.InvalidRequesterRror)绑定参数'V_VAR'需要一个值[SQL:“()\runit_test_new_stored_procedure:\rbegin\r声明V_VAR VARCHAR(50);\r选择'hello world!'\r INTO?;\rend;”][参数:[{}]]

你知道一种方法来避免这个错误信息,这样我上面的DDL语句就可以毫无错误地执行了吗?

共有1个答案

裴实
2023-03-14

session.execute()解释纯SQL字符串,就像在text()构造中传递一样。因此,您必须转义不希望被解释为占位符开头的冒号:

对于需要一个冒号的SQL语句(如在内联字符串中),使用反斜杠转义

因此您的DDL语句query应该是:

"""
REPLACE PROCEDURE DEV_MIGRATION_TOOL.UNIT_TEST_NEW_STORED_PROCEDURE()
UNIT_TEST_NEW_STORED_PROCEDURE:
BEGIN
    DECLARE V_VAR VARCHAR(50);
    SELECT 'Hello World!'
    INTO \\:V_VAR;
END;
"""

注意,反斜杠是故意转义的。Python的较新版本将为无效转义序列(如“\:”)生成SyntaxWarning,如果不使用原始字符串文本。

 类似资料:
  • 我试图运行这个简单的原始sql语句与参数SQLALChemy(在一个alembic脚本): 我得到以下错误: 解决方案:

  • 问题内容: 避免嵌套查询有多重要。 我一直学会避免像瘟疫一样躲避它们。但是对我来说,它们是最自然的事情。在设计查询时,我首先写的是嵌套查询。然后,我将其转换为联接,有时需要花费很多时间才能正确。而且很少会带来很大的性能提升(有时确实会提高) 他们真的那么糟糕吗?有没有一种方法可以使用没有临时表和文件排序的嵌套查询 问题答案: 这确实取决于我遇到的情况,我可以通过使用子查询来改进一些查询。 我知道的

  • 问题内容: 我试图使用sqlalchemy执行原始sql查询,想知道什么是“正确”的方法。 我的查询如下(目前): 我不喜欢的是字符串格式和缺少任何参数处理(在music_volume中用引号引起来的:-D)。 我试图遵循以下答案: 如何在SQLAlchemy- flask应用程序中执行原始SQL 应用我阅读的内容后,我的代码段如下所示: 但是我收到错误,指出mv和ml无法识别参数。 如果我将代码

  • 你能帮我解决这个错误吗? 2017-08-05 18:54:18,421 INFOsqlalchemy.engine.base.Engine(4L,)2017-08-05 18:54:18,424 INFOsqlalchemy.engine.base.Engine COMMIT127.0.0.1--[05/Aug/2017 18:54:18]"GET/HTTP/1.1"200-127.0.0.1

  • 问题内容: 我用来从表中获取数据。现在,从称为的表中获取所有记录正在按预期方式工作。 现在,我希望对多个列执行查询,如下所示: 但这给LIKE带来了错误。我怎样才能做到这一点? 问题答案: 请像运营商一样使用 http://docs.sqlalchemy.org/en/rel_0_9/core/sqlelement.html#sqlalchemy.sql.operators.ColumnOpera

  • 问题内容: 这个查询非常简单,我要做的就是按字段对给定类别中的所有文章进行排序: 但是它运行非常缓慢。这是EXPLAIN所说的: 有没有一种方法可以重写此查询或向我的PHP脚本中添加其他逻辑,以避免并加快速度? 表结构: 更新 我已经索引了。我想我的情况在文档中得到了解释: 在某些情况下,MySQL无法使用索引来解析ORDER BY,尽管它仍然使用索引来查找与WHERE子句匹配的行。这些情况包括: