Pyodbc 批量插入语句无法参数化
我正在尝试用Python来处理CSV文件,然后把清理好的数据放到SQL表里,最后进行批量上传。当我试着用下面这种方式插入数据时:
sqlCommand = "BULK INSERT ? FROM ? WITH ( BATCHSIZE = 1000, ROWTERMINATOR = '\\n', KEEPNULL )"
cursor.execute(sqlCommand,tableName,fileName)
我遇到了这个错误:在'@P1'附近的语法不正确。(102) (SQLExecDirectW);
但是,如果我用这种方式:
"BULK INSERT {0} FROM {1} WITH ( BATCHSIZE = 1000, ROWTERMINATOR = '\\n', KEEPNULLS )".format(tableName,fileName)
cursor.execute(sqlCommand)
就能完美运行。
有没有更好的方法让这个工作正常呢?
1 个回答
1
在T-SQL中,不能使用?
这种参数占位符来表示表名和列名。
第二种选择是使用Python中的字符串格式化,在执行之前先构建好T-SQL语句。这种方法也叫做动态SQL
,而且这是使用BULK INSERT
完成你任务的唯一方法。
动态SQL(以及一般来说未经验证的输入)会带来SQL注入
的安全风险,所以如果这个脚本是给用户使用的,一定要确保对tableName
和fileName
这两个变量进行验证。