Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中手动创建表时出错_Python_Sql Server_Django - Fatal编程技术网

Python 在Django中手动创建表时出错

Python 在Django中手动创建表时出错,python,sql-server,django,Python,Sql Server,Django,所以只需要一点背景: 我正在做的是创建一个内部应用程序,允许用户上传CSV文件,然后将每个文件存储在一个新表中,某些查询将针对该表进行数据计算。因此,我正在构建一个系统,在上传文件时动态创建表,然后在接下来的60天内使用密钥引用表,以避免重新上传文件。我认为最简单的方法不是创建动态模型,而是创建一个只执行特定查询所需的确切SQL并返回信息的类 问题: 我目前的问题是,我无法让create_table语法正常工作,它不断抛出错误。我想我只是在理解如何正确设置参数时遇到了一个问题。我也正在连接到Mi

所以只需要一点背景:

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

问题:

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

下面是两段脚本:

表1.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

我已经查看了所有堆栈溢出,并阅读了此处的文档:,但无法找出出现此错误的原因。

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

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

  c.execute("CREATE TABLE %s (<snip>)" % t_name)
c.execute(“创建表%s()%t\u name)

您必须非常小心,不要在此处引入SQL注入
t_name
必须进行适当的消毒(并且这并不意味着引用了)。

我在底部链接的文档中的这一部分怎么样:
codecursor.execute(“从baz='30%%'和id=%s',[self.id]的条形图中选择foo”)
从这里看,您可以在字符串中指定参数,这就是我要做的,因为Django应该负责SQL的参数化you@WakeskaterX这种查询格式使用预先准备好的语句,正如我指出的,这些语句不适用于
createtable
。现在,你试图做的是非常不安全的,同时你似乎并不真正理解你在做什么。我建议您在继续之前暂停一段时间,弄清楚准备好的语句和SQL转义是什么意思。这是针对内部应用程序的,而不是面向公众的站点,所以我只是尝试使用一些基本检查。我不知道不能在创建表时使用参数化,这不是我过去尝试过的,而且是有意义的。但这似乎确实是我试图做的错误。@请将表名转换为unicode并使用
isalnum()
,然后检查所有字符是否都在ASCII范围内。应该可以了。是的,提交时表名就是这样生成的,但在作为查询提交之前,我还添加了相同的函数作为检查。它确实工作正常并生成了表。