所以只是一点背景:
我正在做的是创建一个内部应用程序,允许用户上传CSV文件,然后将每个文件存储在一个新表中,以便运行某些查询来进行数据计算。因此,我构建了一个系统,在这个系统中,在上传文件时动态创建表,然后在接下来的60天内使用密钥引用表,以避免重新上载文件。我认为最简单的方法是创建一个只执行特定查询所需的确切SQL并返回信息的类,而不是创建动态模型。
问题:
我目前的问题是,我无法使create_table语法正常工作,并且不断抛出错误。我想我只是在理解如何正确设置参数时遇到问题。我还连接到Microsoft SQL Server。所以这是我的例外页面:
以下是剧本的几段片段:
table.py:
from django.db import connection
import sys
def create_table(table_name):
print("Table name is: "+str(table_name))
t_name = table_name
if not table_exists(table_name):
with connection.cursor() as c:
c.execute("CREATE TABLE %s (RecordID int PRIMARY KEY NOT NULL IDENTITY(1,1), Email varchar(255), Mailbox varchar(255), Domain varchar(255), Match_Type varchar(50), Correction varchar(255))",[t_name])
return True
else:
print("Table Already Exists: "+table_name)
return False
processor.py:
from DataStorage.models import RecordList, RecordData
from DataStorage.table import table_exists, create_table
import string, random
def handle_uploaded_file(f,cust_name=None,):
#Check if our file exists already and is complete
if RecordList.objects.filter(file_name=f.name).exists():
item = RecordList.objects.get(file_name=f.name)
if table_exists(item.table_name):
return None
else:
create_table(item.table_name)
else:
with open('files/'+f.name, 'wb') as destination:
for chunk in f.chunks():
destination.write(chunk);
guid = generate_guid(12)
record = RecordList(record_ID=guid,customer_name=cust_name,file_name=f.name,table_name=get_tablename(f.name))
record.save()
create_table(record.table_name)
return guid
我已经查看了Stack Overflow,并在此处阅读了文档:Django Executing Custom SQL Directly,但无法弄清楚我为何会收到此错误。
答案 0 :(得分:0)
不应引用CREATE TABLE
中的表格名称。这也意味着它不能作为参数传递(在您的情况下在预准备语句中)。
您需要使用常规字符串插值:
c.execute("CREATE TABLE %s (<snip>)" % t_name)
你必须非常小心,不要在这里引入SQL注入。必须对t_name
进行适当的清理(并不意味着引用)。