为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 execute() 第二个参数创建带有 psycopg2 的数据库?

如何使用 execute() 第二个参数创建带有 psycopg2 的数据库?

qq_花开花谢_0 2022-05-19 16:05:10
我正在尝试使用用户将提供的名称创建数据库。据我所知,正确的方法是使用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,请改用 {}

  • 自动提交模式是该语句工作的必要条件

  • 指定的连接用户需要创建权限



查看完整回答
反对 回复 2022-05-19
  • 1 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信