Saya mendapat banyak kesalahan dengan pesan:
"DatabaseError: current transaction is aborted, commands ignored until end of transaction block"
setelah diubah dari python-psycopg ke python-psycopg2 sebagai mesin basis data proyek Django.
Kode tetap sama, hanya tidak tahu dari mana kesalahan itu berasal.
python
django
postgresql
psycopg2
mendongkrak
sumber
sumber
conn.rollback()
(di mana samb adalah objek koneksi Anda) akan menghapus kesalahan sehingga Anda dapat menjalankan kueri lainJawaban:
Inilah yang dilakukan postgres ketika kueri menghasilkan kesalahan dan Anda mencoba menjalankan kueri lain tanpa terlebih dahulu mengembalikan transaksi. (Anda mungkin menganggapnya sebagai fitur keselamatan, agar Anda tidak merusak data Anda.)
Untuk memperbaikinya, Anda akan ingin mencari tahu di mana dalam kode yang kueri buruknya dijalankan. Mungkin bermanfaat untuk menggunakan opsi log_statement dan log_min_error_statement di server postgresql Anda.
sumber
Untuk menghilangkan kesalahan, gulung kembali transaksi terakhir (yang salah) setelah Anda memperbaiki kode Anda:
Anda dapat menggunakan coba-kecuali untuk mencegah kesalahan terjadi:
Lihat: dokumentasi Django
sumber
IntegrityError
dan bukan kelas dasarDatabaseError
?Jadi, saya mengalami masalah yang sama. Masalah yang saya alami di sini adalah bahwa database saya tidak disinkronkan dengan benar. Masalah sederhana sepertinya selalu menyebabkan ...
Untuk menyinkronkan django db Anda, dari dalam direktori aplikasi Anda, dalam terminal, ketik:
Sunting: Perhatikan bahwa jika Anda menggunakan Django-selatan, menjalankan perintah '$ python manage.py migrate' juga dapat menyelesaikan masalah ini.
Selamat coding!
sumber
python manage.py migrate <app>
... untuk semua aplikasi saya.django-south
-migrate
perintah tidak dibangun ke Django.Di Flask Anda hanya perlu menulis:
Dokumentasi PS ada di sini https://www.postgresql.org/docs/9.4/static/sql-rollback.html
sumber
Dalam pengalaman saya, kesalahan ini terjadi seperti ini:
Tidak ada yang salah dengan permintaan kedua, tetapi karena kesalahan yang sebenarnya ditangkap, permintaan kedua adalah yang menimbulkan kesalahan (jauh lebih informatif).
sunting: ini hanya terjadi jika
except
klausa menangkapIntegrityError
(atau pengecualian basis data tingkat rendah lainnya), Jika Anda menangkap sesuatu sepertiDoesNotExist
kesalahan ini tidak akan muncul, karenaDoesNotExist
tidak merusak transaksi.Pelajaran di sini adalah jangan coba-coba / kecuali / lulus.
sumber
Saya pikir pola priestc menyebutkan lebih mungkin menjadi penyebab umum masalah ini ketika menggunakan PostgreSQL.
Namun saya merasa ada kegunaan yang valid untuk pola dan saya tidak berpikir masalah ini harus menjadi alasan untuk selalu menghindarinya. Sebagai contoh:
Jika Anda merasa OK dengan pola ini, tetapi ingin menghindari kode penanganan transaksi eksplisit di semua tempat maka Anda mungkin ingin melihat ke dalam mengaktifkan mode autocommit (PostgreSQL 8.2+): https://docs.djangoproject.com/en/ dev / ref / database / # autocommit-mode
Saya tidak yakin apakah ada pertimbangan kinerja yang penting (atau jenis lainnya).
sumber
Jika Anda mendapatkan ini saat berada di shell interaktif dan perlu perbaikan cepat, lakukan ini:
awalnya terlihat dalam jawaban ini
sumber
Saya mengalami perilaku serupa saat menjalankan transaksi yang tidak berfungsi di
postgres
terminal. Tidak ada yang melewati setelah ini, karenadatabase
berada dalam keadaanerror
. Namun, sama seperti perbaikan cepat, jika Anda mampu menghindarinyarollback transaction
. Mengikuti melakukan trik untuk saya:COMMIT;
sumber
Saya punya masalah silimar. Solusinya adalah dengan bermigrasi db (
manage.py syncdb
ataumanage.py schemamigration --auto <table name>
jika Anda menggunakan selatan).sumber
cukup gunakan rollback
Kode contoh
sumber
Saya baru saja mengalami kesalahan ini juga, tetapi menutupi pesan kesalahan lain yang lebih relevan di mana kode mencoba menyimpan string 125 karakter dalam kolom 100 karakter:
Saya harus men-debug kode untuk menampilkan pesan di atas, jika tidak akan ditampilkan
sumber
Menanggapi @priestc dan @Sebastian, bagaimana jika Anda melakukan sesuatu seperti ini?
Saya baru saja mencoba kode ini dan tampaknya berhasil, gagal diam-diam tanpa harus peduli tentang kemungkinan kesalahan, dan berfungsi saat kueri baik.
sumber
Saya percaya jawaban @ AnujGupta benar. Namun rollback itu sendiri dapat menimbulkan pengecualian yang harus Anda tangkap dan tangani:
Jika Anda menemukan menulis ulang kode ini di berbagai
save()
lokasi, Anda dapat mengekstrak-metode:Akhirnya, Anda dapat memproduksinya menggunakan dekorator yang melindungi metode yang menggunakan
save()
:Bahkan jika Anda menerapkan dekorator di atas, masih nyaman untuk disimpan
try_rolling_back()
sebagai metode yang diekstraksi jika Anda perlu menggunakannya secara manual untuk kasus-kasus di mana penanganan spesifik diperlukan, dan penanganan dekorator generik tidak cukup.sumber
Ini perilaku yang sangat aneh bagi saya. Saya terkejut bahwa tidak ada yang memikirkan savepoint. Dalam kode saya, kueri yang gagal diharapkan perilaku:
Saya telah mengubah kode cara ini untuk menggunakan savepoints:
sumber
Dalam shell Flask, semua yang perlu saya lakukan adalah
session.rollback()
melewati ini.sumber
Saya telah bertemu masalah ini, kesalahan keluar karena transaksi kesalahan belum berakhir dengan benar, saya menemukan
postgresql_transactions
perintah Kontrol Transaksi di siniKontrol Transaksi
Perintah berikut digunakan untuk mengendalikan transaksi
jadi saya gunakan
END TRANSACTION
untuk mengakhiri kesalahan TRANSACTION, kode seperti ini:sumber
Anda dapat menonaktifkan transaksi melalui "set_isolation_level (0)"
sumber