Driver mssql-python menentukan hierarki pengecualian standar, pola penanganan kesalahan umum, dan pemetaan kode SQLSTATE untuk SQL Server dan Azure SQL.
Hierarki pengecualian
Driver mssql-python mengikuti hierarki pengecualian DB-API 2.0 (PEP 249):
Exception (builtins)
├── Warning
└── Error
├── InterfaceError
└── DatabaseError
├── DataError
├── OperationalError
├── IntegrityError
├── InternalError
├── ProgrammingError
└── NotSupportedError
ConnectionStringParseError (standalone, not part of hierarchy)
Deskripsi pengecualian
Tangkap pengecualian paling spesifik yang sesuai dengan situasi Anda. Misalnya, tangkap IntegrityError untuk pelanggaran batasan pada INSERT/UPDATE operasi, dan ProgrammingError untuk masalah sintaks SQL selama pengembangan. Tangkap kelas dasar Error hanya sebagai penggantian.
| Pengecualian |
Ketika dinaikkan |
Warning |
Peringatan non-fatal dari database. |
Error |
Kelas dasar untuk semua kesalahan database. |
InterfaceError |
Kesalahan yang terkait dengan antarmuka database (driver), bukan database itu sendiri. |
DatabaseError |
Kesalahan yang terkait dengan database. |
DataError |
Kesalahan karena masalah dengan data yang diproses (pembagian nol, nilai di luar jangkauan). |
OperationalError |
Kesalahan yang terkait dengan operasi database (koneksi terputus, alokasi memori, kesalahan transaksi). |
IntegrityError |
Kesalahan saat integritas database terpengaruh (pelanggaran kunci asing, batasan unik). |
InternalError |
Kesalahan database internal (kursor tidak valid, transaksi tidak sinkron). |
ProgrammingError |
Kesalahan pemrograman (kesalahan sintaks, tabel tidak ditemukan, jumlah parameter yang salah). |
NotSupportedError |
Fitur tidak didukung oleh database atau driver. |
ConnectionStringParseError |
Sintaks string koneksi tidak valid atau kata kunci tidak dikenal. |
Penanganan kesalahan dasar
Gunakan blok try-except untuk menangani kesalahan database:
import mssql_python
try:
conn = mssql_python.connect(connection_string)
cursor = conn.cursor()
cursor.execute("INSERT INTO Production.Product (Name) VALUES (%(name)s)", {"name": "Test"})
conn.commit()
except mssql_python.IntegrityError as e:
print(f"Constraint violation: {e}")
conn.rollback()
except mssql_python.ProgrammingError as e:
print(f"SQL syntax error: {e}")
except mssql_python.OperationalError as e:
print(f"Connection or operational error: {e}")
except mssql_python.Error as e:
print(f"Database error: {e}")
finally:
if 'conn' in locals():
conn.close()
Akses pengecualian melalui koneksi
Anda dapat menangkap pengecualian melalui instance koneksi:
try:
cursor.execute("INVALID SQL")
except conn.ProgrammingError as e:
print(f"Caught via connection: {e}")
Struktur pesan kesalahan
Objek pengecualian mssql-python mengekspos tiga atribut yang berasal dari kelas dasar driverException:
| Attribute |
Source |
Deskripsi |
driver_error |
Driver Python |
Teks bahasa Inggris standar yang dipilih oleh SQLSTATE dikembalikan dari ODBC (misalnya, "Communication link failure", , "Invalid authorization specification""Syntax error or access violation"). Stabil di seluruh rilis; aman untuk mencocokkan substring. |
ddbc_error |
Konektivitas Database Langsung (DDBC) |
Pesan sisi server, biasanya diawali dengan [Microsoft][SQL Server]. Format bukanlah kontrak yang stabil. |
message |
Terdiri |
f"Driver Error: {driver_error}; DDBC Error: {ddbc_error}". Inilah yang str(exc) kembali. |
try:
cursor.execute("SELECT * FROM no_such_table;")
except mssql_python.ProgrammingError as exc:
print(exc.driver_error) # Base table or view not found
print(exc.ddbc_error) # [Microsoft][SQL Server]Invalid object name 'no_such_table'.
print(exc) # Driver Error: Base table or view not found; DDBC Error: ...
Nomor kesalahan mesin SQL Server (seperti 208 atau 40501) tidak diekspos sebagai atribut dan tidak disematkan secara andal di salah satu string. Mengklasifikasikan kesalahan berdasarkan subkelas pengecualian ditambah driver_error teks. Untuk pembatasan Azure SQL, lihat Coba lagi logika.
Klasifikasi SQLSTATE
mssql-python menggunakan SQLSTATE yang dikembalikan oleh ODBC untuk memilih subkelas pengecualian Python dan driver_error teks. Pemetaan pengecualian → SQLSTATE lengkap ada exceptions.py di sumber driver. Bagian berikutnya mencantumkan SQLSTATE yang paling sering muncul dengan SQL Server dan Azure SQL.
Kesalahan koneksi
Kegagalan koneksi dari mssql_python.connect() menaikkan mssql_python.OperationalError, sama seperti kegagalan konektivitas lainnya:
import mssql_python
try:
conn = mssql_python.connect(
"Server=unreachable-server.database.windows.net;"
"Database=<database>;"
"Authentication=ActiveDirectoryDefault;"
"Encrypt=yes"
)
except mssql_python.OperationalError as e:
print(f"Connection failed: {e.driver_error}")
# e.driver_error: "Client unable to establish connection"
Kesalahan string koneksi
Kesalahan penguraian string koneksi memunculkan ConnectionStringParseError:
try:
conn = mssql_python.connect("Servr=localhost;") # Typo
except mssql_python.ConnectionStringParseError as e:
print(f"Invalid connection string: {e}")
# Output: Unknown keyword 'Servr'
Referensi kode SQLSTATE
Kode SQLSTATE adalah kode lima karakter yang mengidentifikasi kondisi kesalahan. Dua karakter pertama menunjukkan kelas, dan tiga karakter terakhir menunjukkan subkelas. Anda jarang perlu memeriksa kode-kode ini secara langsung. Sebagai gantinya, tangkap jenis pengecualian Python yang sesuai (tercantum di kolom "Pengecualian"). Gunakan kode SQLSTATE saat Anda perlu membedakan antara kondisi kesalahan tertentu dalam jenis pengecualian yang sama, misalnya untuk membedakan kebuntuan (40001) dari kegagalan koneksi umum (08S01).
Kelas 00 - Berhasil menyelesaikan
| SQLSTATE |
Pengecualian |
Deskripsi |
| 00000 |
None |
Keberhasilan |
Kelas 01 - Peringatan
| SQLSTATE |
Pengecualian |
Deskripsi |
| 01000 |
Warning |
Peringatan umum |
| 01001 |
Warning |
Konflik operasi kursor |
| 01002 |
Warning |
Putuskan sambungan |
| 01003 |
DataError |
Nilai NULL dihilangkan dalam fungsi yang ditetapkan |
| 01004 |
DataError |
Data string, pemangkasan kanan |
| 01006 |
Warning |
Hak istimewa tidak dicabut |
| 01007 |
Warning |
Hak istimewa tidak diberikan |
| 01S00 |
Warning |
Atribut string koneksi tidak valid |
| 01S01 |
Warning |
Kesalahan dalam baris |
| 01S02 |
Warning |
Nilai opsi berubah |
Kelas 07 - Kesalahan SQL Dinamis
| SQLSTATE |
Pengecualian |
Deskripsi |
| 07001 |
Kesalahan Pemrograman |
Jumlah parameter yang salah |
| 07002 |
Kesalahan Pemrograman |
Bidang COUNT salah |
| 07005 |
Kesalahan Pemrograman |
Pernyataan yang disiapkan bukan spesifikasi kursor |
| 07006 |
Kesalahan Pemrograman |
Pelanggaran atribut jenis data terbatas |
| 07009 |
Kesalahan Pemrograman |
Indeks deskriptor tidak valid |
| 07S01 |
Kesalahan Pemrograman |
Penggunaan parameter default tidak valid |
Kelas 08 - Pengecualian koneksi
| SQLSTATE |
Pengecualian |
Deskripsi |
| 08001 |
Kesalahan Operasional |
Klien tidak dapat membuat koneksi |
| 08002 |
Kesalahan Operasional |
Nama koneksi yang digunakan |
| 08003 |
Kesalahan Operasional |
Koneksi tidak ada |
| 08004 |
Kesalahan Operasional |
Server menolak koneksi |
| 08007 |
Kesalahan Operasional |
Kegagalan koneksi selama transaksi |
| 08S01 |
Kesalahan Operasional |
Kegagalan tautan komunikasi |
Kelas 21 - Pelanggaran kardinalitas
| SQLSTATE |
Pengecualian |
Deskripsi |
| 21S01 |
Kesalahan Pemrograman |
Daftar nilai yang dimasukkan tidak sesuai dengan daftar kolom |
| 21S02 |
Kesalahan Pemrograman |
Tingkat tabel turunan tidak cocok dengan daftar kolom |
Kelas 22 - Pengecualian data
| SQLSTATE |
Pengecualian |
Deskripsi |
| 22001 |
DataError |
Data string, pemangkasan kanan |
| 22002 |
DataError |
Variabel indikator diperlukan tetapi tidak disediakan |
| 22003 |
DataError |
Nilai numerik di luar rentang |
| 22007 |
DataError |
Format tanggalwaktu tidak valid |
| 22008 |
DataError |
Meluapnya bidang tanggalwaktu |
| 22012 |
DataError |
Pembagian dengan nol |
| 22015 |
DataError |
Meluapnya bidang interval |
| 22018 |
DataError |
Nilai karakter tidak valid untuk spesifikasi cast |
| 22019 |
DataError |
Karakter escape tidak valid |
| 22025 |
DataError |
Urutan escape tidak valid |
| 22026 |
DataError |
Data string, ketidakcocokan panjang |
Kelas 23 - Pelanggaran batasan integritas
| SQLSTATE |
Pengecualian |
Deskripsi |
| 23000 |
IntegritasKesalahan |
Pelanggaran batasan integritas (umum) |
Kelas 24 - Status kursor tidak valid
| SQLSTATE |
Pengecualian |
Deskripsi |
| 24000 |
Kesalahan Internal |
Status kursor tidak valid |
Kelas 25 - Status transaksi tidak valid
| SQLSTATE |
Pengecualian |
Deskripsi |
| 25000 |
Kesalahan Operasional |
Status transaksi tidak valid |
| 25S01 |
Kesalahan Operasional |
Status transaksi tidak diketahui |
| 25S02 |
Kesalahan Operasional |
Transaksi masih aktif |
| 25S03 |
Kesalahan Operasional |
Transaksi dibatalkan |
Kelas 28 - Spesifikasi otorisasi yang tidak valid
| SQLSTATE |
Pengecualian |
Deskripsi |
| 28000 |
Kesalahan Operasional |
Spesifikasi otorisasi tidak valid (login gagal) |
Kelas 34 - Nama kursor tidak valid
| SQLSTATE |
Pengecualian |
Deskripsi |
| 34000 |
Kesalahan Pemrograman |
Nama kursor tidak valid |
Kelas 3C - Nama kursor duplikat
| SQLSTATE |
Pengecualian |
Deskripsi |
| 3C000 |
Kesalahan Pemrograman |
Nama kursor duplikat |
Kelas 3D - Nama katalog tidak valid
| SQLSTATE |
Pengecualian |
Deskripsi |
| 3D000 |
Kesalahan Pemrograman |
Nama katalog tidak valid |
Kelas 3F - Nama skema tidak valid
| SQLSTATE |
Pengecualian |
Deskripsi |
| 3F000 |
Kesalahan Pemrograman |
Nama skema tidak valid |
Kelas 40 - Pengembalian transaksi
| SQLSTATE |
Pengecualian |
Deskripsi |
| 40001 |
Kesalahan Operasional |
Kegagalan serialisasi (kebuntuan) |
| 40002 |
Kesalahan Operasional |
Pelanggaran batasan integritas menyebabkan pengembalian |
| 40003 |
Kesalahan Operasional |
Penyelesaian pernyataan tidak diketahui |
Kelas 42 - Kesalahan sintaks atau pelanggaran aturan akses
| SQLSTATE |
Pengecualian |
Deskripsi |
| 42000 |
Kesalahan Pemrograman |
Kesalahan sintaks atau pelanggaran akses |
| 42S01 |
Kesalahan Pemrograman |
Tabel dasar atau tampilan sudah ada |
| 42S02 |
Kesalahan Pemrograman |
Tabel dasar atau tampilan tidak ditemukan |
| 42S11 |
Kesalahan Pemrograman |
Indeks sudah ada |
| 42S12 |
Kesalahan Pemrograman |
Indeks tidak ditemukan |
| 42S21 |
Kesalahan Pemrograman |
Kolom sudah ada |
| 42S22 |
Kesalahan Pemrograman |
Kolom tidak ditemukan |
Kelas 44 - DENGAN OPSI PERIKSA pelanggaran
| SQLSTATE |
Pengecualian |
Deskripsi |
| 44000 |
IntegritasKesalahan |
DENGAN PELANGGARAN OPSI PEMERIKSAAN |
Kelas HY - kondisi khusus CLI
| SQLSTATE |
Pengecualian |
Deskripsi |
| HY000 |
DatabaseError |
Kesalahan umum |
| HY001 |
Kesalahan Operasional |
Kesalahan alokasi memori |
| HY003 |
Kesalahan Pemrograman |
Jenis buffer aplikasi tidak valid |
| HY004 |
Kesalahan Pemrograman |
Tipe data SQL tidak valid |
| HY007 |
Kesalahan Pemrograman |
Pernyataan terkait tidak disiapkan |
| HY008 |
Kesalahan Operasional |
Operasi dibatalkan |
| HY009 |
Kesalahan Pemrograman |
Penggunaan pointer null tidak valid |
| HY010 |
Kesalahan Pemrograman |
Kesalahan urutan fungsi |
| HY011 |
Kesalahan Pemrograman |
Atribut tidak dapat diatur sekarang |
| HY012 |
Kesalahan Pemrograman |
Kode operasi transaksi tidak valid |
| HY013 |
Kesalahan Operasional |
Kesalahan manajemen memori |
| HY014 |
Kesalahan Operasional |
Batas jumlah pegangan terlampaui |
| HY015 |
Kesalahan Pemrograman |
Tidak ada nama kursor yang tersedia |
| HY016 |
Kesalahan Pemrograman |
Tidak dapat mengubah deskriptor baris implementasi |
| HY017 |
Kesalahan Pemrograman |
Penggunaan pegangan deskriptor yang dialokasikan secara otomatis tidak valid |
| HY018 |
Kesalahan Operasional |
Server menolak permintaan pembatalan |
| HY019 |
Kesalahan Pemrograman |
Data non-karakter dan non-biner dikirim dalam beberapa bagian |
| HY020 |
DataError |
Mencoba menggabungkan nilai null |
| HY021 |
Kesalahan Pemrograman |
Informasi deskriptor yang tidak konsisten |
| HY024 |
Kesalahan Pemrograman |
Nilai atribut tidak valid |
| HY090 |
Kesalahan Pemrograman |
String atau panjang buffer tidak valid |
| HY091 |
Kesalahan Pemrograman |
Pengidentifikasi bidang deskriptor tidak valid |
| HY092 |
Kesalahan Pemrograman |
Pengidentifikasi atribut/opsi tidak valid |
| HY095 |
Kesalahan Pemrograman |
Jenis fungsi di luar jangkauan |
| HY096 |
Kesalahan Pemrograman |
Jenis informasi tidak valid |
| HY097 |
Kesalahan Pemrograman |
Jenis kolom di luar jangkauan |
| HY098 |
Kesalahan Pemrograman |
Jenis ruang lingkup di luar jangkauan |
| HY099 |
Kesalahan Pemrograman |
Jenis nullable di luar jangkauan |
| HY100 |
Kesalahan Pemrograman |
Jenis opsi keunikan di luar rentang |
| HY101 |
Kesalahan Pemrograman |
Jenis opsi akurasi di luar rentang |
| HY103 |
Kesalahan Pemrograman |
Kode pengambilan tidak valid |
| HY104 |
Kesalahan Pemrograman |
Presisi atau nilai skala tidak valid |
| HY105 |
Kesalahan Pemrograman |
Jenis parameter tidak valid |
| HY106 |
Kesalahan Pemrograman |
Ambil jenis di luar jangkauan |
| HY107 |
Kesalahan Pemrograman |
Nilai baris di luar jangkauan |
| HY109 |
Kesalahan Pemrograman |
Posisi kursor tidak valid |
| HY110 |
Kesalahan Pemrograman |
Penyelesaian driver tidak valid |
| HY111 |
Kesalahan Pemrograman |
Nilai bookmark tidak valid |
| HYC00 |
NotSupportedError |
Fitur opsional tidak diimplementasikan |
| HYT00 |
Kesalahan Operasional |
Waktu habis kedaluwarsa |
| HYT01 |
Kesalahan Operasional |
Waktu tunggu koneksi habis |
Kelas IM - Kesalahan pengelola driver
| SQLSTATE |
Pengecualian |
Deskripsi |
| IM001 |
Kesalahan Antarmuka |
Driver tidak mendukung fungsi ini |
| IM002 |
Kesalahan Antarmuka |
Nama sumber data tidak ditemukan |
| IM003 |
Kesalahan Antarmuka |
Pengandar yang ditentukan tidak dapat dimuat |
| IM004 |
Kesalahan Antarmuka |
SQLAllocHandle driver pada SQL_HANDLE_ENV gagal |
| IM005 |
Kesalahan Antarmuka |
SQLAllocHandle driver pada SQL_HANDLE_DBC gagal |
| IM006 |
Kesalahan Antarmuka |
SQLSetConnectAttr driver gagal |
| IM007 |
Kesalahan Antarmuka |
Tidak ada sumber data atau driver yang ditentukan |
| IM008 |
Kesalahan Antarmuka |
Dialog gagal |
| IM009 |
Kesalahan Antarmuka |
Tidak dapat memuat DLL terjemahan |
| IM010 |
Kesalahan Antarmuka |
Nama sumber data terlalu panjang |
| IM011 |
Kesalahan Antarmuka |
Nama driver terlalu panjang |
| IM012 |
Kesalahan Antarmuka |
Kesalahan sintaks kata kunci DRIVER |
| IM014 |
Kesalahan Antarmuka |
DSN tidak valid |
| IM015 |
Kesalahan Antarmuka |
Sumber data file yang rusak |
Nomor kesalahan SQL Server umum
Di luar SQLSTATE, SQL Server menyediakan nomor kesalahan asli dalam tanda kurung. Ini adalah kesalahan yang paling mungkin Anda temui dalam kode aplikasi. Bangun logika coba lagi di sekitar kesalahan 1205 (kebuntuan) dan kesalahan koneksi sementara (lihat Logika coba lagi).
| Kesalahan |
Pola pesan |
Resolution |
| 208 |
Nama objek tidak valid |
Verifikasi bahwa tabel atau tampilan ada dan periksa kualifikasi skema. |
| 547 |
Pelanggaran batasan |
Kunci asing atau batasan pemeriksaan gagal. |
| 2627 |
Pelanggaran batasan unik |
Nilai kunci duplikat dimasukkan. |
| 2601 |
Pelanggaran indeks unik |
Kunci duplikat ada di indeks. |
| 4060 |
Tidak dapat membuka database |
Database tidak ada atau akses ditolak. |
| 18456 |
Gagal masuk |
Kegagalan autentikasi. Periksa kredensial. |
| 1205 |
Korban kebuntuan |
Transaksi digulung balik. Coba lagi operasi. |
Referensi cepat gejala-ke-pengecualian
Gunakan tabel ini untuk memetakan gejala umum ke jenis pengecualian yang harus Anda tangkap:
| Gejala |
Pengecualian |
Kemungkinan penyebabnya |
| "Login gagal untuk pengguna" |
OperationalError |
Kredensial yang salah atau pengguna tidak dipetakan ke database. |
| "Klien tidak dapat membuat koneksi" |
OperationalError |
Server tidak dapat dijangkau, firewall, atau masalah DNS. |
| "Batas waktu kedaluwarsa" |
OperationalError |
Batas waktu kueri atau koneksi. Tingkatkan batas waktu atau optimalkan kueri. |
| "Nama objek tidak valid" |
ProgrammingError |
Tabel tidak ada atau skema tidak ditentukan. |
| "Sintaks salah" |
ProgrammingError |
Kesalahan sintaks SQL. Kueri pengujian di SSMS. |
| "Jumlah parameter yang salah" |
ProgrammingError |
Jumlah parameter tidak cocok dengan placeholder. |
| "Pelanggaran KUNCI UTAMA" |
IntegrityError |
Kunci duplikat. Gunakan MERGE atau periksa sebelum memasukkan. |
| "Pelanggaran KUNCI ASING" |
IntegrityError |
Baris yang direferensikan tidak ada. Masukkan induk terlebih dahulu. |
| "Transaksi menemui jalan buntu" |
OperationalError (kesalahan 1205) |
Kunci pertentangan. Menerapkan logika pengulangan. |
| "Data string atau biner akan dipotong" |
DataError |
Nilai melebihi panjang kolom. Periksa data atau tingkatkan ukuran kolom. |
| "Konversi gagal" |
DataError |
Jenis data tidak cocok. Gunakan jenis Python yang benar untuk kolom. |
| "Kata kunci tidak dikenal" |
ConnectionStringParseError |
Typo dalam kata kunci string koneksi. |
| "Callproc tidak didukung" |
NotSupportedError |
Gunakan cursor.execute("EXECUTE ...") sebagai gantinya. |
Praktik terbaik
-
Tangkap pengecualian tertentu sebelum pengecualian generik. Urutkan dari yang paling spesifik (
IntegrityError) hingga yang paling tidak spesifik (Error).
-
Selalu tangani IntegrityError untuk operasi modifikasi data. Pelanggaran batasan diharapkan dalam operasi normal (misalnya, pengguna mencoba membuat nama pengguna duplikat).
-
Catat konteks kesalahan lengkap untuk pemecahan masalah. Pengecualian mengekspos
driver_error (teks stabil, turunan SQLSTATE) dan ddbc_error (pesan sisi server). Catat keduanya; mengklasifikasikan pada driver_error.
-
Terapkan logika coba lagi untuk kesalahan sementara (kegagalan koneksi, kebuntuan). Lihat Logika coba lagi.
-
Gunakan rollback() di penanganan pengecualian untuk membersihkan transaksi yang gagal. Tanpa pengembalian eksplisit, koneksi tetap dalam status transaksi gagal.
Konten terkait