Python在字符串中添加"E
这个字符串:
"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,我猜测你看到的是转义字符串常量,很可能是你的数据库接口模块或库正确生成的。