要通过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==',))
任何解决方法?
答案 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