在Django中手动创建表时出错

时间:2015-01-07 13:55:22

标签: python sql-server django

所以只是一点背景:

我正在做的是创建一个内部应用程序,允许用户上传CSV文件,然后将每个文件存储在一个新表中,以便运行某些查询来进行数据计算。因此,我构建了一个系统,在这个系统中,在上传文件时动态创建表,然后在接下来的60天内使用密钥引用表,以避免重新上载文件。我认为最简单的方法是创建一个只执行特定查询所需的确切SQL并返回信息的类,而不是创建动态模型。

问题:

我目前的问题是,我无法使create_table语法正常工作,并且不断抛出错误。我想我只是在理解如何正确设置参数时遇到问题。我还连接到Microsoft SQL Server。所以这是我的例外页面:

Django Error Message

以下是剧本的几段片段:

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,但无法弄清楚我为何会收到此错误。

1 个答案:

答案 0 :(得分:0)

不应引用CREATE TABLE中的表格名称。这也意味着它不能作为参数传递(在您的情况下在预准备语句中)。

您需要使用常规字符串插值:

  c.execute("CREATE TABLE %s (<snip>)" % t_name)

你必须非常小心,不要在这里引入SQL注入。必须对t_name进行适当的清理(并不意味着引用)。