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

transaction.commit_unless_managed()の後に使用しcursor.execute()ます。すべてが機能しましたが、パフォーマンスは依然として非常に悪かったです。コードを実行するたびにSQLiteがファイルを開き、ファイルを閉じた直後にファイルを開くためだとどこかで読んだことがあります。したがって、操作の実行を本当に高速化する必要がある場合はbulk_create()、メソッドを使用するだけです。ドキュメントで説明されています。

于 2013-03-19T10:28:35.533 に答える
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 に答える