2011-10-13 12 views
70

मैंने Django/Postgres साइट पर काम करना शुरू कर दिया है। कभी-कभी मैं manage.py shell में काम करता हूं, और गलती से कुछ डीबी क्रिया करता हूं जिसके परिणामस्वरूप त्रुटि होती है। तब मैं किसी भी डेटाबेस कार्रवाई बिल्कुल ऐसा करने में असमर्थ हूँ, क्योंकि किसी भी डेटाबेस कार्रवाई मैं करने की कोशिश के लिए, मैं त्रुटि मिलती है:Django + Postgres: "वर्तमान लेनदेन निरस्त कर दिया गया है, लेनदेन ब्लॉक के अंत तक अनदेखा आदेश"

current transaction is aborted, commands ignored until end of transaction block 

मेरे वर्तमान workaround खोल पुनः आरंभ करने की है, लेकिन मैं एक खोजना चाहिए मेरे खोल सत्र को त्याग दिए बिना इसे ठीक करने का तरीका।

(। मैं this और this पढ़ा है, लेकिन वे क्या खोल से करने के बारे में कार्रवाई योग्य निर्देश देना नहीं है)

+1

मुझे यह समस्या पहले से मिली है और ऐसा करने का कोई तरीका नहीं मिल सका ... – Hoff

+1

[इस] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2979369/databaseerror-current-transaction-is- निरस्त-आदेश-अनदेखा-तक-अंत-का-निशान), जो लगभग समान स्वीकृत समाधान देता है ... – Cerin

उत्तर

110

आप इस कोशिश कर सकते हैं:

from django.db import connection 
connection._rollback() 

अधिक विस्तृत चर्चा This issue can be found here

+4

यह समाधान मेरे लिए काम नहीं कर रहा है। यहां तक ​​कि जब लेनदेन वापस रोलिंग, मैं अब डीबी के साथ * किसी भी * इंटरैक्शन नहीं कर सकता। मुझे एक और कामकाज मिला, मेरा जवाब देखें। – ifischer

+0

अगर _rollback आपके लिए यह नहीं करता है तो @ connection.close() 'भी है (@ifischer) – hobs

3

मुझे एक पूरी तरह से खाली डीबी पर बैकअप बहाल करने के बाद यह त्रुटि हुई थी। यह चलाने के बाद चले गए:

./manage syncdb 

हो सकता है कि वहाँ डंप से लापता कुछ आंतरिक मॉडल थे ...

23

यह कभी कभी मेरे लिए होता है, अक्सर यह याद आ रही है

manage.py migrate 

या

manage.py syncdb 

जैसा कि उल्लेख किया गया है

यदि आपके मॉडलों से एक योजनाबद्ध लंबित है तो यह भी दूसरी तरफ हो सकता है। दक्षिण के साथ आपको स्कीमा को अपडेट करने की आवश्यकता है।

manage.py schemamigration mymodel --auto 
+0

./manage.py माइग्रेट मेरी समस्या को ठीक करें, धन्यवाद! –

2

चेतावनी: पैच नीचे संभवतः लेनदेन डाटाबेस (कम से कम postgres के साथ) पर एक खुला राज्य में छोड़ दिया जा रहा हो सकता है। इसके बारे में 100% निश्चित नहीं है (और कैसे ठीक करें), लेकिन मैं अत्यधिक उत्पादन डेटाबेस पर नीचे पैच नहीं करने का सुझाव देता हूं।

स्वीकार्य उत्तर मेरी समस्याओं का समाधान नहीं करता है - जैसे ही मुझे कोई डीबी त्रुटि मिलती है, मैं मैन्युअल रोलबैक के साथ भी कोई भी नई डीबी क्रिया नहीं कर सकता - मैं अपने स्वयं के समाधान के साथ आया।

जब मैं Django-shell चला रहा हूं, तो मैं डीजेगो को डीबी कनेक्शन को बंद करने के लिए पैच करता हूं जैसे ही कोई त्रुटि होती है। इस तरह मुझे लेनदेन को वापस करने या कनेक्शन को संभालने के बारे में कभी सोचना नहीं है।

from django import db 
from django.db.backends.util import CursorDebugWrapper 
old_execute = CursorDebugWrapper.execute 
old_execute_many = CursorDebugWrapper.executemany 

def execute_wrapper(*args, **kwargs): 
    try: 
     old_execute(*args, **kwargs) 
    except Exception, ex: 
     logger.error("Database error:\n%s" % ex) 
     db.close_connection 

def execute_many_wrapper(*args, **kwargs): 
    try: 
     old_execute_many(*args, **kwargs) 
    except Exception, ex: 
     logger.error("Database error:\n%s" % ex) 
     db.close_connection 

CursorDebugWrapper.execute = execute_wrapper 
CursorDebugWrapper.executemany = execute_many_wrapper 
+1

यदि कोई दिलचस्पी लेता है: मैंने django-एक्सटेंशन shell-plus कमांड को स्टार्टअप पर फ़ाइलों को लोड करने में सक्षम होने के लिए बढ़ाया है, जिसमें मैं इस पैच समेत अन्य सामानों के अलावा हूं। https://github.com/ifischer/django-extensions – ifischer

+1

यह निश्चित रूप से कनेक्शन को खुला छोड़ देगा, क्योंकि 'django.db.close_connection' एक फ़ंक्शन है और यदि आप इसे कुछ करना चाहते हैं तो '()' के साथ कॉल करने की आवश्यकता है;) मैं अक्सर 'django.db.connection.close()' करता हूं जिसे 'close_connection' द्वारा उपनाम किया जा सकता है, पता नहीं। – hobs

13

Check this

त्वरित जवाब जोड़कर डेटाबेस स्तर autocommit चालू करने के लिए आमतौर पर है:

इस कोड को मैं अपने Django-खोल-सत्र की शुरुआत में लोड हो रहा है कर रहा हूँ है

'OPTIONS': {'autocommit': True,} 

डेटाबेस सेटिंग्स में।

+0

कहां? आप इसे कहां जोड़ते हैं? – dviljoen

+0

सेटिंग्स फ़ाइल में, डेटाबेसस शब्दकोश के अंदर: https://docs.djangoproject.com/en/dev/ref/settings/#autocommit। –

0

यदि आपको migrate (दक्षिण) चलाते समय ऐसी त्रुटि मिलती है, तो यह हो सकता है कि आपके पास डेटाबेस स्कीमा में बहुत सारे बदलाव हैं और उन्हें एक साथ सभी को संभालना चाहते हैं। पोस्टग्रेस उस पर थोड़ा बुरा है। हमेशा क्या काम करता है, छोटे कदमों में एक बड़े प्रवास को तोड़ना है। सबसे अधिक संभावना है, आप एक संस्करण नियंत्रण प्रणाली का उपयोग कर रहे हैं।

  • आपका वर्तमान संस्करण
  • प्रतिबद्ध n1
  • प्रतिबद्ध n2
  • n3 प्रतिबद्ध
  • प्रतिबद्ध n4 # db में परिवर्तन
  • प्रतिबद्ध n5
  • n6 प्रतिबद्ध
  • प्रतिबद्ध n7 # db changse
  • Commit n8
  • प्रतिबद्ध n9 # db में परिवर्तन
  • प्रतिबद्ध N10

तो, ऊपर वर्णित स्थिति हो रही है, इस प्रकार कार्य करें:

  • चेकआउट भंडार करने के लिए "n4", तो syncdb और चले जाते हैं।
  • चेकआउट रिपोजिटरी "n7", फिर syncdb और माइग्रेट करें।
  • चेकआउट रिपोजिटरी "n10", फिर syncdb और माइग्रेट करें।

और आप कर चुके हैं। :)

इसे निर्दोष रूप से चलाना चाहिए।

0

यदि आप 1.6 से पहले django संस्करण का उपयोग कर रहे हैं तो आपको क्रिस्टोफ़ के उत्कृष्ट xact मॉड्यूल का उपयोग करना चाहिए।

xact PostgreSQL पर Django अनुप्रयोगों में समझदारी से लेनदेन को संभालने के लिए एक नुस्खा है।

नोट: Django 1.6 के रूप में, xact की कार्यक्षमता को डीजेगो कोर में परमाणु सजावटी के रूप में विलय कर दिया जाएगा। कोड जो xact का उपयोग करता है, केवल एक खोज-और-प्रतिस्थापन के साथ परमाणु पर माइग्रेट किया जा सकता है। PostgreSQL के अलावा डेटाबेस पर परमाणु काम, थ्रेड-सुरक्षित है, और इसमें अन्य अच्छी विशेषताएं हैं; जब आप कर सकते हैं इसे स्विच करें!

0

मैं अपनी सेटिंग्स फ़ाइल में निम्न जोड़ता हूं, क्योंकि जब मैं "चारों ओर खेल रहा हूं" तो मुझे ऑटोोकॉमिट सुविधा पसंद है, लेकिन जब मेरी साइट अन्यथा चल रही है तो यह सक्रिय नहीं है।

import sys 
if 'shell' in sys.argv or sys.argv[0].endswith('pydevconsole.py'): 
    DATABASES['default']['OPTIONS']['autocommit'] = True 

नोट::

तो बस खोल में autocommit प्राप्त करने के लिए, मैं इस छोटे से हैक कर दूसरे भाग सिर्फ इसलिए कि मैं PyCharm में काम करते हैं, जो सीधे manage.py

0

मैं चलाने नहीं करता है Django 1.7 में यह त्रुटि मिली। जब मैं the documentation में पढ़ता हूं कि

This problem cannot occur in Django’s default mode and atomic() handles it automatically.

मुझे थोड़ा संदिग्ध मिला।त्रुटियां हुईं, जब मैंने माइग्रेशन चलाने की कोशिश की। यह पता चला कि मेरे कुछ मॉडलों में my_field = MyField(default=some_function) था। इस फ़ंक्शन को एक फ़ील्ड के लिए डिफॉल्ट के रूप में ठीक करने के साथ ठीक से SQLite और mysql के साथ काम किया गया था (मेरे पास कुछ आयात त्रुटियां थीं, लेकिन मैं इसे काम करने में कामयाब रहा), हालांकि यह पोस्टग्रेस्क्ल के लिए काम नहीं कर रहा है, और इसने माइग्रेशन को इस बिंदु पर तोड़ दिया कि मैं घटना को एक उपयोगी त्रुटि संदेश नहीं मिला, बल्कि इसके बजाय प्रश्न शीर्षक से एक।

+0

एक नेक्रोप्रोस्ट का बिट, लेकिन मैं इस सटीक मुद्दे पर टक्कर मार रहा हूं। क्या आपने इसे हल करने का प्रबंधन किया था? – Aubricus

+1

इस बिंदु पर याद नहीं किया जा सकता है। मेरा सबसे अच्छा सुझाव माइग्रेशन चरणों को एकाधिक माइग्रेशन फ़ाइलों में विभाजित करेगा और देखें कि इससे मदद मिलती है या नहीं। स्कीमा परिवर्तन और डेटा परिवर्तन पोस्टग्रेज़ – Eldamir

+0

धन्यवाद के साथ एक ही माइग्रेशन फ़ाइल में नहीं हो सकता है! यह पता चला है कि Django उस त्रुटि को निगल रहा था जिसे मैंने आखिरकार पीडीबी के माध्यम से देखा। त्रुटि के आधार पर मैंने निर्भरता सूची में कुछ अतिरिक्त आइटम जोड़कर समस्या को ठीक किया। – Aubricus

संबंधित मुद्दे