Skip to main content

Unprintable Interface Error object pada flask-sqlalchemy

Ini adalah salah satu error yang membuat saya cukup stuck. Frustasi menjelajahi StackOverflow tapi lama tidak menemukan jawaban yang pas (atau mungkin saya yang tidak paham bahwa jawaban itu sudah ada di depan mata).

Untung saya punya strategi. Kalau saya stuck di satu project, saya pindah mengerjakan project lain, sambil menunggu barangkali ada ilham berupa solusi untuk bug di kode saya. Ini jadi semacam refreshing untuk saya karena tema dan problem solving-nya berbeda.

Saya ketemu bug ini di kode saya saat mengembangkan aplikasi web untuk gamifikasi salah satu mata kuliah di kampus. Pandemi yang kayak gini mau nggak mau memaksa kita berinovasi, toh?

Pas lagi semangat-semangatnya, malah terbentur bug ini. Gara-gara ini pula saya libur mengerjakan project itu lebih dari seminggu. Tapi tentu saja saya ganti mengerjakan project lain sambil sibuk intensive coding bootcamp juga di salah satu tempat kursus pemrograman favorit (udah murah, belajarnya sebulan, ilmunya daging, khususnya di kelas project RN).

Errornya seperti ini:

Unprintable interface error object pada flask-sqlalchemy
 

Kalau hanya melihat sepintas, agak susah menginterpretasikan error message ini. Kalau dilihat lebih detail di terminal (bukan di debug message via browser) maka akan jelas terlihat bahwa ada satu parameter yang ditolak dengan pesan "error binding parameter n" (dimana n adalah angka entah 1 atau 2 atau 3, tergantung posisi data tersebut). Dari sini saya tahu bahwa saya keliru dalam input data ke dalam database.

Saya menghabiskan waktu cukup lama untuk googling. Rupanya setelah sekian lama googling ada titik terang, bahwa ada yang salah dalam kode saya, yaitu saat saya melakukan penyimpanan object ke dalam database (db.session.add dan db.session commit).

Jadi kode saya pada awalnya seperti ini:

Unprintable interface error object flask-sqlalchemy


Di dalam routes.py Saya mencoba membuat route untuk menambahkan data projectstage. Nah, dua diantara fields yang ada di dalam models.py merupakan field db.relationship dan juga ForeignKey field, dimana pada forms.py, saya juga populate data dari database untuk ditampilkan ke halaman web sebagai komponen html select option dengan memanfaatkan QuerySelectField, maksudnya agar saat menambah data projectstage atau edit data lebih gampang dan teratur karena pilihan misi dan alat sudah diambilkan dari dalam database.

unprintable interface error object pada flask-sqlalchemy

unprintable interface error object pada flask-sqlalchemy

Inilah yang pada awalnya membuat saya bingung. Padahal letak kesalahannya bukan pada QuerySelectField maupun field db.relationshipnya. Namun, letak kekeliruannya adalah pada saat saya memasukkan data ke dalam foreign key field.

Nah, di sini dapat dilihat bagaimana saya keliru dalam build instance of object di dalam routes.py. Saya memang membangun instance dengan menambahkan data yang didapatkan dari form ke dalam object, namun saya juga masih berusaha memasukkan data berupa object ke dalam field ForeignKey, padahal di dalam definisi tabel isi dari field ini (karena foreign key) ya biasanya adalah index.

Saya baru menyadari kekeliruan saya setelah saya membaca artikel ini, yang di salah satu paragrafnya berbunyi:


Dari sini saya baru 'ngeh' kalau yang bakal 'dilihat' sama database ya hanya fields yang memang didefinisikan sebagai field sejak awal, maupun field yang didefinisikan sebagai ForeignKey.

Sedangkan field yang didefinisikan dengan db.relationship (sebagaimana yang disyaratkan dalam dokumentasi flask-sqlalchemy) fungsinya agar aplikasi kita tahu keterkaitan data yang sedang kita bangun. Jadi ForeignKey field untuk dibaca database, sementara relationship field untuk dibaca aplikasi.

Dengan membaca value di dalam field db.relationship, aplikasi bisa tahu objek yang mana yang sedang diolah, sehingga dengan itu app bisa mengaitkan dengan tabel yang terkait dengan menggunakan 'backref'.

Sementara, untuk masalah saya solusinya yaitu dengan mengubah data yang disimpan di dalam ForeignKey field langsung berupa data id bukan data objectnya.


unprintable interface error object flask-sqlalchemy


That's it! Semoga bermanfaat..

 

Comments

Popular posts from this blog

Belajar Coding Intensive Bootcamp Online 300 ribuan selama Sebulan dapat apa saja?

Sekedar catatan sedikit tentang apa yang saya pelajari saat mengikuti online intensive coding bootcamp kelas project React Native selama sebulan kemarin. Pada umumnya cukup menantang karena setiap hari harus catch up dengan materi yang diberikan dan tugas harian (ya, tugasnya pun setiap hari, jadi peserta mau tidak mau harus coding tiap hari). Selain itu ada quiz tiap akhir pekan atau dalam kasus kelas project tiap akhir pekan harus menyelesaikan Mini Project yang merupakan bagian dari Final Project. Lalu apa saja yang dipelajari selama sebulan tersebut? (dengan biaya Rp 300 K itu? *atau Rp 200K karena saya dapat voucher 100rb). Beberapa hal yang saya pelajari: SplashScreen dan onBoarding  Register (dengan OTP)  Login (dengan JWT ke API Sanbercode, Google Sign In dengan firebase, serta local sign in dengan sidik jari / fingerprint)  Passing data dengan menggunakan route.params melalui navigation, passing data dengan konteks ({useContext}) serta melalui props  Home Page kekinian meman

Cara Mengambil Foto dengan RNCamera dan Upload Foto ke API di React Native

Berikut ini catatan singkat saya saat belajar mengambil dan upload foto ke API menggunakan React Native yang saya pelajari saat mengikuti Indonesia Mengoding Intensive Coding Bootcamp React Native Kelas Project yang diadakan Sanbercode. Sebelumnya, bukan bermaksud iklan, namun pengalaman saya mengikuti batch online intensive coding bootcamp di Sanbercode cukup recommended (khususnya jika kita sudah memiliki sedikit saja dasar pengetahuan programming. Jika belum ada dasar pengalaman pemrograman, Sanbercode juga menawarkan kelas dasar yang bisa diikuti pemula). Jadi ini adalah honest review. Saya sendiri telah mengambil kelas Laravel Web Devt (30 hari), React Native Dasar (30 hari) dan React Native lanjutan atau kelas project (30 hari). Investasi totalnya hanya 700 ribu rupiah (3 bulan intensive online bootcamp!), itu jika tanpa potongan.  Dengan biaya 200 ribu rupiah untuk kelas dasar dan 300 ribu rupiah untuk kelas project, saya rasa jika dibandingkan Coding Bootcamp lain yang harga

Cara atau Solusi Mengatasi java.lang.OutOfMemoryError :app:mergeDexRelease FAILED saat Build APK di React Native

 Pernah mengalami error java.lang.OutOfMemoryError :app:mergeDexRelease FAILED saat Build APK di React Native? Ente nggak sendirian Ndan .. Saya juga pernah mengalami error serupa..   Cara mengatasi / solusi / obatnya ternyata cukup simple. Untuk memastikan bahwa pada saat build APK/AAB tidak terjadi OutofMemory error, kita bisa melakukan setting pada file gradle.     Nah, udah tenang kalau sudah ada build successfull hehe.. Semoga bermanfaat..