python将"E"添加到字符串

Kai*_*Kai 15 python postgresql psycopg

这个字符串:

"CREATE USER %s PASSWORD %s", (user, pw)
Run Code Online (Sandbox Code Playgroud)

总是扩大到:

CREATE USER E'someuser' PASSWORD E'somepassword'
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么?

编辑:上面的扩展字符串是我的数据库在错误消息中返回的字符串.我正在使用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()
Run Code Online (Sandbox Code Playgroud)

Clo*_*eto 17

要通过标识符通过psycopg使用到PostgreSQL AsIsextensions模块

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'
Run Code Online (Sandbox Code Playgroud)

这也适用于将条件传递给条款,例如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'
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 10

由于OP的编辑显示他正在使用PostgreSQL,因此的文档是相关的,他们说:

PostgreSQL还接受"转义"字符串常量,它是SQL标准的扩展.通过在开始单引号之前写入字母E(大写或小写)来指定转义字符串常量,例如E'foo'.

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

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

(它发生的情况也是非原始Python字符串文字的转义约定).

OP的错误显然与此无关,而且,除了研究PostgreSQL优秀文档的优秀想法之外,他不应该担心E'...'这种情况下的形式;-).


Yan*_*ier 8

不仅E而且引号似乎来自用户和pw所具有的任何类型.%s只执行str()所做的事情,这可能会回退到repr(),两者都有相应的方法__str____repr__.此外,这不是生成结果的代码(我假设有一个%,但现在只看到一个逗号).请使用实际代码,类型和值扩展您的问题.

附录:考虑到它看起来像SQL,我猜测你正在看到转义字符串常量,可能是由数据库接口模块或库正确生成的.