2016-08-08 12 views
0

私のモデルとビューファイルはこちらです。私の目的は、自分のモデルに追加したdb( "Entries")に新しい属性を追加し、python manage.pyコマンドを使って移行を行うことでした。これはうまくいっていて、すべてのものに正しいデフォルト "NA"を持つ新しい属性がありました。私は、ファイルを読んで、その列を使って正しい値でdbを更新したいと思っていました。ただし、.save()コマンドが実行された後、DBが正しく更新されましたが、私の例外エラーがスローされ、tryブロックが残っていた点を除いて、 "うまくいきました"。なぜ、もし他の誰がこの問題を持っていたと言うことができる私が思っていたDjango save()を使用してdbを更新すると例外がスローされますが、dbはまだ更新されていますか?

私は他の誰かが同じ問題を持っていたし、(保存についてDjangoのサイト上のドキュメントを読んでかどうかを確認するために探してみました

) [https://docs.djangoproject.com/en/1.9/topics/db/models/]

私はこの問題を解決するために将来どのようにするか。

私のdbが更新されたことは、後で "Data.objects.all()"を実行し、 "Probes"と "Entries"をそれぞれ印刷して、それらがすべてNAから何に変更されたかを確認しました。私のファイルはだった。

ありがとうございました。私のviews.py右に

models.py

class Data(models.Model): 
    Probes = models.CharField(primary_key=True, max_length=50) 
    Entries = models.CharField(max_length=25, default="NA") 
    Symbol = models.CharField(max_length=50) 
    Pattern = models.CharField(max_length=25) 
    Day1 = models.FloatField() 
    Day3 = models.FloatField() 

    class Meta: 
     unique_together = (('Probes', 'Symbol', 'Pattern'),) 

views.py

def testUpdateDB(passFileName): 

f = open(passFileName, 'r') 

for Line in f: 
    Line = Line.replace('\r',"") 
    Line = Line.replace('\n', "") 

    row = Line.split(",") 

    AryList = {"Probes": row[0], 
       "Entries":row[2], 
       "Symbol": row[3], 
       "Pattern":row[4], 
       "Day1": row[5], 
       "Day3": row[6] 
       } 
    try: 
     # Update the database 
     t = Data.objects.get(Probes=AryList["Probes"]) 

     print(t.Probes + " has " + t.Entries + " for its entries, updating to " + AryList["Entries"]) 

     t.Entries = AryList["Entries"] 
     t.save() 

     u = Data.objects.get(Probes=AryList["Probes"]) 

     print(u.Probes + " has " + u.Entries + " for its entries now. Update was sussess!") 

    except: 
     print("Could not find: " + AryList["Probes"]) 

後/ "t.save()" プログラムが例外ブロックとプリントにスキップ中そのメッセージを出してください。その後、私はdbを見て、すべてが正しく更新されていることを確認できますが、なぜ例外が発生しましたか?また、なぜtryブロック全体が終了しなかったのですか?誰でもデータベースを更新しようとするとこのエラーが発生します。

+0

なぜあなたは 'u'を持ってきますか?あなたは既に 't'にオブジェクトを持っています – patito

+1

**決して、決して**空の' except'をしないでください。あなたはtryブロックの中に6行あり、例外はそれらのいずれかによって引き起こされる可能性があります。他の(おそらく些細な)エラーがある可能性があります。 Dataが存在しないときに例外をキャッチするだけなら、それをキャッチします: 'except Data.DoesNotExist:'。 –

+0

Patito、私がデバッグしていたとき、私はそれがtだと思ったので、新しいvarにクエリ結果を割り当てようとしました。 –

答えて

0

エラーが発生した場合は、transaction.atomic()を使用してください。ブロック内のすべてのコードがロールバックされます。ブロック全体が実行されない限り、何も保存されません。

上記のリンクの例で十分に文書化されていますが、アトミックトランザクション内ですべてのsave()を使用してみてください。

+1

transaction.atomic()を使用するときは、あなたの設定に '' 'ATOMIC_REQUESTS = True'''をセットしてください。 –

+0

@luke_aus' ATOMIC_REQUESTS'は 'transaction.atomic()'と全く同じことをします。あなたは 'atomic()'を使ってもっと細かいトランザクションコントロールを提供していますか? – knbk

0

ヘッダーレコードが問題の原因です。一度ファイルの最初のレコードを破棄するとすべてがうまくいった。ここで

が更新Views.py手伝うために皆に

views.py

def testUpdateDB(passFileName): 

    f = open(passFileName, 'r') 

    discardHeader = f.readline() # New line which removes header record 

    for Line in f: 
     # Everything else stay the same as before # 

おかげファイルです。

関連する問題