使用原始SQL时,数据库没有变化

时间:2013-03-18 13:25:04

标签: python sql django

我需要向数据库写入许多简单的记录,并且使用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,因为数据库中已有一些记录。

3 个答案:

答案 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中进行描述。