我正在尝试使用用户将提供的名称创建数据库。据我所知,正确的方法是使用execute()的第二个参数。所以我做了如下:import psycopg2conn = psycopg2.connect(host="...", dbname="...", user="...", password="...", port='...')cursor = conn.cursor()query = ''' CREATE DATABASE %s ;'''name = 'stackoverflow_example_db'conn.autocommit = Truecursor.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 注入,因此必须使用第二个参数。
1 回答
慕的地6264312
TA贡献1817条经验 获得超6个赞
如果语句是 CREATE DATABASE 语句,则不能将值作为execute() 的第二个参数传递。
正如unutbu所指出的,解决此问题的一种方法是使用psycopg2.sql子模块并使用标识符来构建避免 SQL 注入的语句。
编码:
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,请改用 {}
自动提交模式是该语句工作的必要条件
指定的连接用户需要创建权限
添加回答
举报
0/150
提交
取消