如何在传递给text()的字符串中转义:以防止SQLAlchemy将其视为bindparameter?

conn.execute(text("select 'My favorite emoticon is :p' from dual")).fetchone()

将导致:

sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) A value is required for bind parameter 'p'
(Background on this error at: http://sqlalche.me/e/14/cd3x)

'

这有点令人困惑,因为从数据库select 'foo :bar baz'中 Select 字符串的上下文来看,bindparameter在这里没有多大意义.

看起来我可以用\来逃避这一点,但它说这是不推荐的:

>>> conn.execute(text("select 'My favorite emoticon is \:p' from dual")).fetchone()
<stdin>:1: DeprecationWarning: invalid escape sequence \:
('My favorite emoticon is :p',)

推荐答案

正如docs年前提到的:

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

但是请记住,反斜杠也是Python字符串文本中的转义字符,所以

text("select 'My favorite emoticon is \:p' from dual")

不正确,因为Python希望将\:解释为转义字符.我们需要使用"原始字符串"(r"")

text(r"select 'My favorite emoticon is \:p' from dual")

或者避开反斜杠本身

text("select 'My favorite emoticon is \\:p' from dual")

Python相关问答推荐

如何用symy更新分段函数

计算所有前面行(当前行)中列的值

acme错误-Veritas错误:模块收件箱没有属性linear_util'

当多个值具有相同模式时返回空

'discord.ext. commanders.cog没有属性监听器'

标题:如何在Python中使用嵌套饼图可视化分层数据?

优化pytorch函数以消除for循环

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

给定高度约束的旋转角解析求解

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

为什么numpy. vectorize调用vectorized函数的次数比vector中的元素要多?

lityter不让我输入左边的方括号,'

在pandas/python中计数嵌套类别

交替字符串位置的正则表达式

python sklearn ValueError:使用序列设置数组元素

判断Python操作:如何从字面上得到所有decorator ?

查看pandas字符列是否在字符串列中

根据Pandas中带条件的两个列的值创建新列

类型对象';敌人';没有属性';损害';

.awk文件可以使用子进程执行吗?