在 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
必须正确清理(并且 这并不意味着引用 )。
简单介绍一下背景知识:
我正在做的是创建一个内部应用程序,允许用户上传 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
必须正确清理(并且 这并不意味着引用 )。