Django+Postgres: "वर्तमान लेनदेन निरस्त कर दिया गया है, लेनदेन ब्लॉक के अंत तक अनदेखा आदेश"



postgresql (6)

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

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

मेरा वर्तमान कामकाज खोल को पुनरारंभ करना है, लेकिन मुझे अपने खोल सत्र को छोड़ दिए बिना इसे ठीक करने का कोई तरीका ढूंढना चाहिए।

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

https://src-bin.com



Answer #2

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

यह समस्या Django के डिफ़ॉल्ट मोड में नहीं हो सकती है और परमाणु () स्वचालित रूप से इसे संभालती है।

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


Answer #3

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

इसलिए खोल में ऑटोकॉमिट प्राप्त करने के लिए, मैं यह छोटा हैक करता हूं:

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

नोट: वह दूसरा भाग सिर्फ इसलिए है क्योंकि मैं PyCharm में काम करता हूं, जो सीधे manage.py को चलाता नहीं है


Answer #4

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

  • आपका वर्तमान संस्करण
  • Commit एन 1
  • Commit एन 2
  • Commit एन 3
  • Commit एन 4 # डीबी परिवर्तन
  • Commit एन 5
  • Commit एन 6
  • Commit n7 # डीबी changse
  • Commit एन 8
  • Commit n9 # डीबी परिवर्तन
  • Commit एन 10

इसलिए, ऊपर वर्णित स्थिति होने के साथ, निम्नानुसार करें:

  • चेकआउट भंडार "n4", फिर सिंकडीबी और माइग्रेट करें।
  • चेकआउट भंडार "n7", फिर सिंकडीबी और माइग्रेट करें।
  • "N10" में चेकआउट भंडार, फिर syncdb और माइग्रेट करें।

और आपने कल लिया। :)

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


Answer #5

यह कभी-कभी मेरे साथ होता है, अक्सर यह गायब है

manage.py migrate 

या

manage.py syncdb

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

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

manage.py schemamigration mymodel --auto

Answer #6

इसे देखो

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

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

डेटाबेस सेटिंग्स के लिए।





postgresql