Postgres psycopg2创建用户

时间:2018-10-27 13:56:35

标签: 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/9warrAttrgd8EF0gkvQ.

%s似乎在用户名周围加上了引号,而postgres在创建用户时不喜欢这样。以下代码可以正常工作:

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

任何解决方法?

2 个答案:

答案 0 :(得分:2)

使用psycopg2.extensions.AsIs(object):

select count(*, typeof(a)='A') as cnt_a, count(*, typeof(a)='B') as cnt_b,
  count(*, typeof(a)='C') as cnt_c from A#time(2 sec) as a

答案 1 :(得分:2)

现有答案中没有一个实际上使用一种安全的方法来执行此操作。但是,自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