我需要向数据库写入许多简单的记录,并且使用orm方法非常慢,所以我决定尝试使用原始SQL。我写了代码,这里是:
for row in rows:
name = row.split('\t')[0].lower()
print name
try:
cursor.execute("INSERT INTO domain_browser_domain (name) VALUES (%s)", [name])
except django.db.utils.IntegrityError:
continue
问题是......它实际上没有向数据库写任何东西。字段name
被定义为唯一,因此当execute
方法不在try
块中时,它会返回IntegrityError
,因为数据库中已有一些记录。
答案 0 :(得分:0)
您好像回答了自己的问题。您无法将新行插入数据库,因为它违反了数据库本身中的完整性约束。这不是Django阻止你做某事的例子。相反,Django正在解释从数据库返回的错误。
答案 1 :(得分:0)
我认为你需要在name
变量中的每个值之后添加逗号。随着您的查询现在构建,它最终将如下所示:
INSERT INTO domain_browser_domain (name) VALUES (one two three)
没有逗号。
您需要在执行之前格式化查询。
print语句的输出是什么?
答案 2 :(得分:0)
在transaction.commit_unless_managed()
之后使用cursor.execute()
。一切正常,但它的表现仍然非常糟糕。我读过某个地方,因为SQLite每次执行代码时都会打开文件,就在它关闭文件之后。因此,如果您真的需要加快操作执行速度 - 只需使用bulk_create()
方法,就会在documentation中进行描述。