Python在字符串中添加"E

15 投票
4 回答
7578 浏览
提问于 2025-04-16 02:08

这个字符串:

"CREATE USER %s PASSWORD %s", (user, pw)

总是被扩展成:

CREATE USER E'someuser' PASSWORD E'somepassword'

有人能告诉我为什么吗?

编辑:上面扩展后的字符串是我从数据库中收到的错误信息。我正在使用psycopg2来访问我的Postgres数据库。实际的代码看起来是这样的:

conn=psycopg2.connect(user=adminuser, password=adminpass, host=host)
cur = conn.cursor()

#user and pw are simple standard python strings the function gets as parameter
cur.execute("CREATE USER %s PASSWORD %s", (user, pw))
conn.commit()

4 个回答

10

根据提问者的编辑内容,他正在使用PostgreSQL,所以这里提到的文档是相关的,文档中提到:

PostgreSQL也接受“转义”字符串常量,这是一种对SQL标准的扩展。转义字符串常量的写法是在开头的单引号前加上字母E(可以是大写或小写),例如E'foo'。

换句话说,psycopg正在正确生成你的字符串的转义字符串常量(所以,正如文档中也提到的:

在转义字符串中,反斜杠字符(\)开始一个类似C语言的反斜杠转义序列,其中反斜杠和后面的字符组合表示一个特殊的字节值。

(实际上,这也是非原始Python字符串字面量的转义规则)。

提问者的错误显然与此无关,除了认真研究PostgreSQL的优秀文档外,他不必担心这种E'...'的写法;-)。

17

要通过psycopg把标识符传递给postgresql,可以使用来自extensions模块的AsIs

from psycopg2.extensions import AsIs
import psycopg2
connection = psycopg2.connect(database='db', user='user')
cur = connection.cursor()
cur.mogrify(
    'CREATE USER %s PASSWORD %s', (AsIs('someuser'), AsIs('somepassword'))
    )
'CREATE USER someuser PASSWORD somepassword'

这同样适用于将条件传递给像order by这样的子句:

cur.mogrify(
    'select * from t order by %s', (AsIs('some_column, another column desc'),)
    )
'select * from t order by some_column, another column desc'
8

不仅是字母E,连引号也似乎是根据用户和密码的类型生成的。%s的作用就像str()函数,它可能会退回到repr(),这两个函数都有对应的方法__str____repr__。另外,这段代码并不是生成你结果的代码(我原本以为有个%,但现在只看到一个逗号)。请把你的问题扩展一下,提供实际的代码、类型和数值。

补充说明:考虑到这看起来像是SQL,我猜测你看到的是转义字符串常量,很可能是你的数据库接口模块或库正确生成的。

撰写回答