Python Postgres psycopg2创建用户

Python Postgres psycopg2创建用户,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,要通过psycopg2创建用户,我使用以下代码: cur=conn.cursor() cur.execute("create user %s with password %s",('abcdefgh','0h/9warrAttrgd8EF0gkvQ==',)) 这会产生以下错误: syntax error at or near "'abcdefgh'" LINE 1: create user 'abcdefgh' with password '0h/9warrAttrg

要通过psycopg2创建用户,我使用以下代码:

        cur=conn.cursor()
    cur.execute("create user %s with password %s",('abcdefgh','0h/9warrAttrgd8EF0gkvQ==',))
这会产生以下错误:

syntax error at or near "'abcdefgh'" LINE 1: create user 'abcdefgh' with password '0h/9warrAttrgd8EF0gkvQ.
似乎%s在用户名周围加了引号,这是postgres在创建用户时不喜欢的。以下代码可以正常工作:

        cur.execute("create user abcdefgh with password %s",('0h/9warrAttrgd8EF0gkvQ==',))
对此有什么解决方法吗?

使用

来自psycopg2.extensions的

当前执行(“使用密码%s创建用户%s”,(AsIs('abcdefgh'),'0h/9warrAttrgd8EF0gkvQ==',))
使用

来自psycopg2.extensions的

当前执行(“使用密码%s创建用户%s”,(AsIs('abcdefgh'),'0h/9warrAttrgd8EF0gkvQ==',))

现有答案中没有一个实际使用安全的方法。然而,自Psycopg的2.7版以来,有一种更好的方法

文档中关于使用
%s
作为标识符(表名、用户名等)的说明:

仅应通过此方法绑定查询值:不应使用此方法将表名或字段名合并到查询(Psycopg将尝试将表名引用为字符串值,从而生成无效的SQL)。如果需要动态生成SQL查询(例如,动态选择表名),可以使用psycopg2.SQL模块提供的工具

使用此模块,上述查询可以更好地表述为:

从psycopg2导入sql
query=sql.sql(“使用密码{PASSWORD}创建用户{username}”).format(
username=sql.Identifier('abcdefgh'),
password=sql.Placeholder()
)
cur.execute(查询,('0h/9warrAttrgd8EF0gkvQ==',))

使用

现有的答案实际上都没有使用安全的方法。然而,自Psycopg的2.7版以来,有一种更好的方法

文档中关于使用
%s
作为标识符(表名、用户名等)的说明:

仅应通过此方法绑定查询值:不应使用此方法将表名或字段名合并到查询(Psycopg将尝试将表名引用为字符串值,从而生成无效的SQL)。如果需要动态生成SQL查询(例如,动态选择表名),可以使用psycopg2.SQL模块提供的工具

使用此模块,上述查询可以更好地表述为:

从psycopg2导入sql
query=sql.sql(“使用密码{PASSWORD}创建用户{username}”).format(
username=sql.Identifier('abcdefgh'),
password=sql.Placeholder()
)
cur.execute(查询,('0h/9warrAttrgd8EF0gkvQ==',))

使用带有加密密码的

是一件更好的事情,
加密的
是最新版本的默认设置。虽然您不确定用户名是否是有效标识符,但我想您更愿意使用。@Migwell-我不认为开发人员有任何理由不知道字符串是否是有效标识符。如果他想使用带引号的标识符,没有任何东西可以阻止他使用双引号,例如带加密密码的
AsIs(“'NewUser')
是一件更好的事情
encrypted
是最新版本的默认值。尽管如果你不确定用户名是否确实是有效的标识符,我想你会更喜欢。@Migwell-我不认为开发人员有任何理由不知道字符串是否是有效标识符。如果他想使用带引号的标识符,没有任何东西可以阻止他使用双引号,例如
AsIs(“'NewUser'))