我在sqlite3中使用django
,这是我的models.py
:
from django.db import models
from django.conf import settings
from django.utils import timezone
class VoterDetails(models.Model):
number = models.CharField(max_length=200,null=True)
voter_id = models.CharField(null=True,max_length=200)
elector_name = models.CharField(max_length=200,null=True)
father_or_husband_name = models.CharField(max_length=200,null=True)
has_husband = models.CharField(max_length=200,null=True)
house_no = models.CharField(max_length=200,null=True)
age = models.CharField(max_length=200,null=True)
sex = models.CharField(max_length=6,null=True)
ac_name = models.CharField(max_length=200,null=True)
parl_constituency = models.CharField(max_length=200,null=True)
part_no = models.CharField(max_length=200,null=True)
year = models.CharField(max_length=200,null=True)
state = models.CharField(max_length=200,null=True)
filename = models.CharField(max_length=200,null=True)
main_town = models.CharField(max_length=200,null=True)
police_station = models.CharField(max_length=200,null=True)
mandal = models.CharField(max_length=200,null=True)
revenue_division = models.CharField(max_length=200,null=True)
district = models.CharField(max_length=200,null=True)
pin_code = models.CharField(max_length=200,null=True)
polling_station_name = models.CharField(max_length=200,null=True)
polling_station_address = models.CharField(max_length=200,null=True)
net_electors_male = models.CharField(max_length=200,null=True)
net_electors_female = models.CharField(max_length=200,null=True)
net_electors_third_gender = models.CharField(max_length=200,null=True)
net_electors_total = models.CharField(max_length=200,null=True)
change = models.CharField(default="",max_length=200,null=True)
def __str__(self):
return self.elector_name
正如人们所看到的,没有属性,它会声称是主键。在这种情况下,django
生成属性id
,它是一个自动递增的Auto field
,被选作主键。
我进行了迁移,然后检查了由此生成的表temp_voterdetails
的模式。(temp
是我的应用程序的名称。)
sqlite> .schema temp_voterdetails
CREATE TABLE IF NOT EXISTS "temp_voterdetails" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"age" varchar(200) NULL,
"ac_name" varchar(200) NULL,
"change" varchar(200) NULL,
"district" varchar(200) NULL,
"elector_name" varchar(200) NULL,
"father_or_husband_name" varchar(200) NULL,
"filename" varchar(200) NULL,
"has_husband" varchar(200) NULL,
"main_town" varchar(200) NULL,
"mandal" varchar(200) NULL,
"net_electors_female" varchar(200) NULL,
"net_electors_male" varchar(200) NULL,
"net_electors_third_gender" varchar(200) NULL,
"net_electors_total" varchar(200) NULL,
"number" varchar(200) NULL,
"pin_code" varchar(200) NULL,
"police_station" varchar(200) NULL,
"polling_station_address" varchar(200) NULL,
"polling_station_name" varchar(200) NULL,
"revenue_division" varchar(200) NULL,
"sex" varchar(6) NULL,
"state" varchar(200) NULL,
"voter_id" varchar(200) NULL,
"year" varchar(200) NULL,
"house_no" varchar(200) NULL,
"parl_constituency" varchar(200) NULL,
"part_no" varchar(200) NULL);
如您所见,属性的顺序是字母顺序的,因此与models.py
文件中属性的原始声明顺序有所不同。
除了这件事,我还尝试通过以下方式导入CSV(遵循models.py
文件中定义的结构):
.mode csv
.separator ","
.import /path/to/my/csv temp_voterdetails
然后我得到了错误(显然是行数):
INSERT failed: UNIQUE constraint failed: temp_voterdetails.id
/path/to/my/csv:164705: expected 28 columns but found 27 - filling the rest with NULL
因此,起初我以为我没有为“ id”提供任何输入,因此它必须是自动生成的,因此绝不能使UNIQUE约束失效。但是,可惜的是,从django到sqlite3的字母顺序转换,似乎从number
输入了id,最后只剩下一列。因此,UNIQUE约束失败,最后一列未使用。
如何确保我创建的表的架构设计正确且与models.py
中定义的模型相同?
更新:停止自动按字母顺序排列的属性顺序后,我将在最后添加属性global_number
(AUTO INCREMENT,主键)。其他所有属性都可能与现有的27个列标题匹配,并且最后一个属性(由于CSV文件中不存在)将自动生成,从而生成我的主键。
这是我的计划。如果这有任何错误,请纠正我。
答案 0 :(得分:0)
在sqlite3模型中,属性似乎总是按字母顺序排列,因此,我们无法使用sqlite3直接导入csv。我面临的主要问题是向表中添加行的速度较慢。这是因为我在每行添加中执行1个查询。通过制作条目对象列表并将其批量添加到表中,可以轻松解决此问题。这仅需要单个查询,因此花费的时间要少得多。这是代码:
import os
import django
os.environ['DJANGO_SETTINGS_MODULE']='<your-site>.settings'
django.setup()
from temp.models import <your-model>
import csv
with open('/path/to/csvfile','r') as f:
reader = csv.reader(f)
lst = []
for i,row in enumerate(reader):
print('Adding :'+str(i))
if(i!=0):
lst.append(<your-model>(
name = row[0], #attribute 1
popularity = row[1], #attribute 2
ssum = row[2], # attribute 3
yearrange = row[3], #attribute 4
state = row[4] # attribute 5
))
<your-model>.objects.bulk_create(lst)