我正在尝试使用用户将提供的名称创建一个数据库。据我所知,正确的方法是使用 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/