在 Django 中手动创建 Table 时出错

Error Manually Creating Table in Django

简单介绍一下背景知识:

我正在做的是创建一个内部应用程序,允许用户上传 CSV 文件,然后将每个文件存储在一个新的 table 中,某些查询将 运行 反对以进行数据计算.因此,我正在构建一个系统,其中 table 是在上传文件时动态创建的,然后可以在接下来的 60 天内使用密钥进行引用,以避免必须 re-upload 文件。我认为最简单的方法不是创建我确实研究过的动态模型,而是创建一个 class 来执行特定查询所需的 SQL 并返回信息。

问题:

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

下面是几个脚本片段:

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,但无法弄清楚为什么会出现此错误。

CREATE TABLE中的table名字不应该被引用。这也意味着它不能作为参数传递(在您的案例中的准备好的语句中)。

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

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

您必须非常小心,不要在此处引入 SQL 注入t_name 必须正确清理(并且 这并不意味着引用 )。