2017-03-01 3 views
0

私は大きなファイルをモデルに挿入する必要があるプロジェクト(時には数ギガバイト)に取り組んでいます。ファイルが大きくなる可能性があるので、私が取っているアプローチは、それを線で読み取ってからDjangoモデルに挿入することです。モデルに大きなデータセットを挿入するDjango - コミットを遅延させる方法

ただし、プロセスでエラーが発生した場合、どのように操作全体をキャンセルするのですか?ファイル全体がエラーなしで処理された後に行がコミットされるようにする適切な方法は何ですか。

もう1つの方法は、すべてのモデルオブジェクトを一度に作成して一括して挿入することです。大規模なデータセットの場合はこれが可能ですか?どのように動作するのでしょうか。

は、ここに私のコードです:

class mymodel(models.Model): 
    fkey1 = models.ForeignKey(othermodel1,on_delete=models.CASCADE) 
    fkey2= models.ForeignKey(othermodel2,on_delete=models.CASCADE) 
    field 1= models.CharField(max_length=25,blank=False) 
    field 2= models.DateField(blank=False) 
    ... 
    Field 12= models.FloatField(blank=False) 

やExcelからモデルにデータを挿入:私は難しく見えているはず

wb=load_workbook(datafile, read_only=True, data_only=True) 
ws=wb.get_sheet_by_name(sheetName) 
for row in ws.rows: 
    if isthisheaderrow(row): 
     #determine column arrangement and pass to next 
     break 
for row in ws.rows: 
    if isthisheaderrow(row): 
     pass 
    elif isThisValidDataRow(row): 
     relevantRow=<create a list of values> 
     dictionary=dict(zip(columnNames,relevantRow)) 
     dictionary['fkey1']=othermodel1Object 
     dictionary['fkey2']=othermodel2Object 
     mymodel(**dictionary).save() 

答えて

0

、デコレータ@transaction.atomicによって遅延させることができるコミット。より詳細な説明はここで与えられる:https://docs.djangoproject.com/en/1.11/topics/db/transactions/

コードビーイング:

wb=load_workbook(trfile, read_only=True, data_only=True) 
ws=wb.get_sheet_by_name(sheetName) 
revenueSwitch=True 
for row in ws.rows: 
    if ifHeaderReturnIndex(row,desiredColumns): 
     selectedIndex=ifHeaderReturnIndex(row, desiredColumns) 
     outputColumnNames=[row[i].value.replace(" ", "") for i in selectedIndex] 
     #output_ws.append(outputColumnNames) 
     break 
@transaction.atomic 
def insertrows(): 
    for row in ws.rows: 
     if ifHeaderReturnIndex(row,desiredColumns): 
      pass 
     elif isRowValid(row,selectedIndex): 
      newrow=[row[i].value for i in selectedIndex] 
      dictionary=dict(zip(outputColumnNames,newrow)) 
      dictionary['UniqueRunID']=run 
      dictionary['SourceFileObject']=TrFile 
      TransactionData(**dictionary).save() 
insertrows()    
+1

はちょうどそれが[コンテキストマネージャ]としても使用できることに留意されたい(https://docs.djangoproject.com/en/ 1.11/topics/db/transactions /#制御トランザクション - 明示的に)( 'with transaction.atomic():')、コードをラップするだけの関数を作成する必要はありません。 – Anonymous

+0

優秀、ありがとう! –

関連する問題