如何使用 execute() 第二个参数创建带有 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 注入,因此必须使用第二个参数。


qq_花开花谢_0
浏览 134回答 1
1回答

慕的地6264312

如果语句是 CREATE DATABASE 语句,则不能将值作为execute() 的第二个参数传递。正如unutbu所指出的,解决此问题的一种方法是使用psycopg2.sql子模块并使用标识符来构建避免 SQL 注入的语句。编码:import psycopg2from psycopg2 import sqlconn = psycopg2.connect(host="...", dbname="...",                        user="...", password="...", port='...')cursor = conn.cursor()query = ''' CREATE DATABASE {} ;'''name = 'stackoverflow_example_db'conn.autocommit = Truecursor.execute(sql.SQL(query).format(    sql.Identifier(name)))cursor.close()conn.close()其他额外观察:format() 不适用于 %s,请改用 {}自动提交模式是该语句工作的必要条件指定的连接用户需要创建权限
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python