我必须使用Django的ORM将8000多条记录插入到SQLite数据库中.此操作需要每分钟大约运行一次cronjob.
目前我正在使用for循环迭代所有项目,然后逐个插入它们.
例:
for item in items:
entry = Entry(a1=item.a1, a2=item.a2)
entry.save()
Run Code Online (Sandbox Code Playgroud)
这样做的有效方法是什么?
编辑:两种插入方法之间的一点比较.
没有commit_manually装饰器(11245条记录):
nox@noxdevel marinetraffic]$ time python manage.py insrec
real 1m50.288s
user 0m6.710s
sys 0m23.445s
Run Code Online (Sandbox Code Playgroud)
使用commit_manually decorator(11245条记录):
[nox@noxdevel marinetraffic]$ time python manage.py insrec
real 0m18.464s
user 0m5.433s
sys 0m10.163s
Run Code Online (Sandbox Code Playgroud)
注意:除了插入数据库之外,测试脚本还执行一些其他操作(下载ZIP文件,从ZIP存档中提取XML文件,解析XML文件),因此执行所需的时间不一定代表插入所需的时间记录.
我正在使用Sqlite在Microsoft Visual C#2008 Express中工作.
我知道我的文本中的一个叛逆者(')在查询中有问题.我的问题是,我认为我可以用\'替换它.它似乎没有工作......这是我的代码的一个例子:
string myString = "I can't believe it!";
cmd.CommandText = "Insert into myTable (myid,mytext) values (1,'" + myString.Replace("'","\\'") + "');";
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:SQLite错误:接近"t":语法错误
我尝试过其他一些替换品......就像其他的斜线一样.我将我的字符串和我的字符串的替换版本写入控制台,以确保它正确出现.
我在这里犯了什么愚蠢的错误?
谢谢!
-Adeena
I am using get_or_create to insert objects to database but the problem is that doing 1000 at once takes too long time.
I tried bulk_create but it doesn't provide functionality I need (creates duplicates, ignores unique value, doesn't trigger post_save signals I need).
甚至可以通过自定义的SQL查询批量进行get_or_create吗?
这是我的示例代码:
related_data = json.loads(urllib2.urlopen(final_url).read())
for item in related_data:
kw = item['keyword']
e, c = KW.objects.get_or_create(KWuser=kw, author=author)
e.project.add(id)
#Add m2m to parent project
Run Code Online (Sandbox Code Playgroud)
related_data包含1000行,如下所示:
[{"cmp":0,"ams":3350000,"cpc":0.71,"keyword":"apple."},
{"cmp":0.01,"ams":3350000,"cpc":1.54,"keyword":"apple -10810"}......]
Run Code Online (Sandbox Code Playgroud)
KW模型还会发送我用来创建另一个父模型的信号:
@receiver(post_save, sender=KW)
def grepw(sender, **kwargs):
if kwargs.get('created', False):
id …Run Code Online (Sandbox Code Playgroud) 我决定使用django的模型系统而不是编写原始SQL来与我的数据库接口,但我遇到的问题肯定是可以避免的.
我的models.py包含:
class Student(models.Model):
student_id = models.IntegerField(unique = True)
form = models.CharField(max_length = 10)
preferred = models.CharField(max_length = 70)
surname = models.CharField(max_length = 70)
Run Code Online (Sandbox Code Playgroud)
我通过循环遍历列表来填充它,如下所示:
from models import Student
for id, frm, pref, sname in large_list_of_data:
s = Student(student_id = id, form = frm, preferred = pref, surname = sname)
s.save()
Run Code Online (Sandbox Code Playgroud)
我真的不想每次都将它保存到数据库中,但我不知道另一种方法让django不要忘记它(我宁愿添加所有行然后再做一次提交).
代码有两个问题.
这很慢 - 大约20名学生每秒更新一次.
它甚至没有通过large_list_of_data,而是抛出一个说"无法打开数据库文件"的DatabaseError.(可能是因为我使用的是sqlite3.)
我的问题是:我怎样才能阻止这两件事发生?我猜这两个问题的根源是我有s.save()但是我没有看到一种方法可以轻松地将学生批处理,然后将它们保存在数据库的一次提交中.