Postgres psycopg2 创建用户。

3
为了通过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==',))

有什么解决办法吗?
2个回答

8

现有答案中没有一种方法是安全的。但是,自Psycopg 2.7版本以来,有一个更好的方法。

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

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

使用此模块,上面的查询可以更好地制定为:

from psycopg2 import sql

query = sql.SQL("CREATE USER {username} WITH PASSWORD {password}").format(
    username=sql.Identifier('abcdefgh'),
    password=sql.Placeholder()
)
cur.execute(query, ('0h/9warrAttrgd8EF0gkvQ==',))

使用https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries来传递SQL查询参数。


2

使用psycopg2.extensions.AsIs(object)

from psycopg2.extensions import AsIs

cur.execute("create user %s with password %s", (AsIs('abcdefgh'), '0h/9warrAttrgd8EF0gkvQ==',))

使用加密密码是一件更好的事情。 - undefined
"encrypted" 是最近版本的默认设置。 - undefined
虽然如果你不确定用户名是否真的是一个有效的标识符,我想你可能更喜欢使用quote_ident - undefined
@Migwell - 我不明白为什么开发人员不知道一个字符串是否是有效的标识符。如果他想使用带引号的标识符,没有任何阻止他使用双引号,例如 AsIs('"NewUser"') - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接