【问题标题】:How to drop and create database using sql sanitizing如何使用 sql 清理删除和创建数据库
【发布时间】:2019-03-13 10:29:06
【问题描述】:

cursor.execute("DROP DATABASE ?", (databasename,))

我正在使用 python3 和 pyodbc 驱动程序。仅在创建和删除数据库时遇到问题。其他操作如 select 工作正常。

出现以下错误: pyodbc.ProgrammingError: ('42000', u"[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]'@P1' 附近的语法不正确。(102) (SQLExecDirectW)")

【问题讨论】:

  • 你不能。参数化查询使用准备好的语句,这些语句只允许绑定“值”,而不是标识符或文字。您必须自己清理表名、列等。另见this Q&A;虽然它被标记为php,但它仍然适用。

标签: python python-3.x azure-sql-database pyodbc


【解决方案1】:

为了清理您的数据,您可以使用 SQL Server QUOTENAME 返回一个添加了分隔符的 Unicode 字符串,以使输入字符串成为有效的 SQL Server 分隔标识符。

您还需要在pyodbc connection 中设置autocommit=True 以允许删除数据库。

conn = pyodbc.connect("DRIVER={SQL Server};"
    "SERVER="+server+";"
    "UID="+username+";"
    "PWD="+password,
    autocommit=True)

cursor = conn.cursor()

your_database_name = "YOUR_DB_NAME"
sql_drop = (
    "DECLARE @sql AS NVARCHAR(MAX);"
    "SET @sql = 'DROP DATABASE ' + QUOTENAME(?);"
    "EXEC sp_executesql @sql"
)

cursor.execute(sql_drop, your_database_name)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多