python - 如何使用 execute() 第二个参数使用 psycopg2 创建数据库?

标签 python psycopg2

我正在尝试使用用户将提供的名称创建一个数据库。据我所知,正确的方法是使用 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 注入(inject),因此必须使用第二个参数。

最佳答案

您不能将值作为 second argument 传递execute(),如果该语句是一个 CREATE DATABASE 语句。

正如 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,请改用 {}
  • 自动提交模式是该语句工作所必需的
  • 指定的连接用户需要创建权限

关于python - 如何使用 execute() 第二个参数使用 psycopg2 创建数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57776043/

相关文章:

database - python 3 : Connect to Remote Postgres Database with SSL

python - 测试 PostgreSQL 表是否不存在(使用 psycopg2)

python - matplotlib pyplot 2 在同一图中使用不同轴绘制

python - DataFrame 未保存正确的值

python - 为什么导入 Mechanize 会破坏我的 aws ec2 Elastic Beanstalk flask "hello world"python 应用程序?

postgresql - 使用 UUID 数组列类型的 psycopy2 错误

python - Pandas:将分组中的唯一项放入单独的行而不是数组中

python - PyAudio IOError : No Default Input Device Available

Python - 避免内存错误与巨大的数据集

Python SQLAlchemy : psycopg2. ProgrammingError 关系已经存在?