0

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

4

3 回答 3

0

我认为您需要在name变量中的每个值之后添加逗号。由于您的查询现在已构建,它最终将如下所示:

INSERT INTO domain_browser_domain (name) VALUES (one two three)没有逗号。

您需要在执行查询之前对其进行格式化。

print 语句的输出是什么?

于 2013-03-18T14:04:20.890 回答
0

你似乎已经回答了你自己的问题。您无法将新行插入到数据库中,因为它违反了数据库本身的完整性约束。这不是 Django 阻止你做某事的实例。相反,Django 正在解释从数据库返回的错误。

于 2013-03-18T13:36:53.263 回答
0

transaction.commit_unless_managed()后使用cursor.execute()。一切正常,但它的性能仍然很糟糕。我在某处读到这是因为 SQLite 每次执行代码时都会打开文件,并且在它刚刚关闭文件之后立即打开文件。因此,如果您确实需要加快操作执行 - 只需使用bulk_create()方法,它在文档中进行了描述。

于 2013-03-19T10:28:35.533 回答