【问题标题】:Postgres psycopg2 create userPostgres psycopg2 创建用户
【发布时间】:2019-04-01 00:46:42
【问题描述】:

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

有什么解决方法吗?

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

    使用psycopg2.extensions.AsIs(object):

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

    【讨论】:

    • with encrypted password 更好
    • encrypted 是最新版本的默认值。
    • 虽然如果您不确定用户名实际上是一个有效的标识符,我想您更喜欢quote_ident
    • @Migwell - 我看不出开发人员有任何理由不知道字符串是否是有效标识符。如果他想使用带引号的标识符,没有什么能阻止他使用双引号,例如AsIs('"NewUser"')
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-05
      • 2019-05-09
      • 2017-03-25
      相关资源
      最近更新 更多