python Postgres psycopg2创建用户

7lrncoxx  于 2023-01-08  发布在  Python
关注(0)|答案(2)|浏览(142)

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

对此有什么解决办法吗?

cgfeq70w

cgfeq70w1#

现有的答案实际上都没有使用一种安全的方法来做这件事。然而,从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==',))

Using https://www.psycopg.org/docs/usage.html#passing-parameters-to-sql-queries

e4yzc0pl

e4yzc0pl2#

使用psycopg2.extensions.AsIs(object):

from psycopg2.extensions import AsIs

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

相关问题