【问题标题】:How to create a database with psycopg2 using execute() second argument?如何使用 execute() 第二个参数创建带有 psycopg2 的数据库?
【发布时间】:2019-09-03 17:05:47
【问题描述】:

我正在尝试使用用户提供的名称创建数据库。据我所知正确的方法是使用execute()的第二个参数。

所以我做了如下:

import psycopg2

conn = psycopg2.connect(host="...", dbname="...",
                        user="...", password="...", port='...')
cursor = conn.cursor()
query = ''' CREATE DATABASE %s ;'''
name = 'stackoverflow_example_db'

conn.autocommit = True
cursor.execute(query, (name,))

cursor.close()
conn.close()

我得到了这个错误:

psycopg2.errors.SyntaxError: syntax error at or near "'stackoverflow_example_db'"
LINE 1:  CREATE DATABASE 'stackoverflow_example_db' ;

我需要做这个语句避免SQL注入,所以使用第二个参数是必须的。

【问题讨论】:

标签: python psycopg2


【解决方案1】:

如果语句是 CREATE DATABASE 语句,则不能将值作为 execute() 的 second argument 传递。

正如unutbu 所指出的,解决此问题的一种方法是使用psycopg2.sql 子模块并使用identifiers 来构建语句avoiding SQL injection

代码:

import psycopg2
from psycopg2 import sql

conn = psycopg2.connect(host="...", dbname="...",
                        user="...", password="...", port='...')
cursor = conn.cursor()
query = ''' CREATE DATABASE {} ;'''
name = 'stackoverflow_example_db'

conn.autocommit = True
cursor.execute(sql.SQL(query).format(
    sql.Identifier(name)))

cursor.close()
conn.close()

其他补充意见:

  • format() 不适用于 %s,请改用 {}
  • 自动提交模式是此语句工作的必要条件
  • 指定的连接用户需要创建权限

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    相关资源
    最近更新 更多