Semua Perkara Yang Perlu Anda Ketahui Mengenai Peta Hubungan Python dan Objek

Semua Perkara Yang Perlu Anda Ketahui Mengenai Peta Hubungan Python dan Objek

Anda mungkin pernah mendengar pemetaan objek-hubungan (ORM). Anda mungkin pernah menggunakannya, tetapi sebenarnya apa itu? Dan bagaimana anda menggunakannya di Python?





Inilah semua yang perlu anda ketahui mengenai ORM dan Python.





Apa itu ORM?

Object-relational mapping (ORM) adalah teknik pengaturcaraan yang digunakan untuk mengakses pangkalan data. Ini memperlihatkan pangkalan data anda ke dalam rangkaian objek. Anda tidak perlu menulis perintah SQL untuk memasukkan atau mengambil data, anda menggunakan serangkaian atribut dan kaedah yang melekat pada objek.





Ini mungkin terdengar rumit dan tidak perlu, tetapi mereka dapat menjimatkan banyak masa, dan membantu mengawal akses ke pangkalan data anda.

Inilah contohnya. Katakan bahawa setiap kali anda memasukkan kata laluan ke dalam pangkalan data anda, anda ingin mencantumkannya, seperti yang dijelaskan dalam keselamatan kata laluan laman web. Ini bukan masalah untuk kes penggunaan sederhana --- anda melakukan pengiraan sebelum memasukkan. Tetapi bagaimana jika anda perlu memasukkan rekod di banyak tempat dalam kod tersebut? Bagaimana jika pengaturcara lain memasukkan ke dalam meja anda, dan anda tidak tahu?



Dengan menggunakan ORM, anda dapat menulis kod untuk memastikan bahawa setiap kali dan di mana sahaja baris atau bidang dalam pangkalan data anda diakses, kod tersuai anda yang lain akan dijalankan terlebih dahulu.

Ini juga bertindak sebagai 'sumber kebenaran tunggal'. Sekiranya anda ingin mengubah pengiraan tersuai, anda hanya perlu mengubahnya di satu tempat, bukan di beberapa tempat. Mungkin melaksanakan banyak prinsip ini dengan pengaturcaraan berorientasikan objek (OOP) di Python , tetapi ORM berfungsi seiring dengan prinsip OOP untuk mengawal akses ke pangkalan data.





Ada perkara-perkara tertentu yang harus diperhatikan ketika menggunakan ORM, dan ada keadaan di mana anda mungkin tidak mahu menggunakannya, tetapi secara amnya perkara tersebut dianggap baik untuk dimiliki, terutama dalam pangkalan data yang besar.

ORM di Python Menggunakan SQLAlchemy

Seperti banyak tugas di Python, lebih cepat dan lebih mudah untuk mengimport modul daripada menulis sendiri. Sudah tentu, mungkin menulis ORM anda sendiri, tetapi mengapa mencipta semula roda?





Contoh berikut semuanya digunakan SQLAlchemy , Python ORM yang popular, tetapi banyak prinsip berlaku tanpa mengira pelaksanaannya.

Menyiapkan Python untuk SQLAlchemy

Sebelum melompat masuk, anda perlu menyiapkan mesin anda untuk pengembangan Python dengan SQLAlchemy.

Anda perlu menggunakan Python 3.6 untuk mengikuti contoh-contoh ini. Walaupun versi lama akan berfungsi, kod di bawah akan memerlukan beberapa pengubahsuaian sebelum dapat dijalankan. Tidak pasti perbezaannya? Soalan Lazim Python kami merangkumi semua perbezaan.

Sebelum membuat pengekodan, anda harus menyediakan persekitaran Python, yang akan mengelakkan masalah dengan pakej Python lain yang diimport.

Pastikan anda mempunyai PIP, pengurus pakej Python dipasang, yang dilengkapi dengan versi Python paling moden.

Setelah anda bersedia untuk pergi, anda boleh memulakan dengan menyiapkan SQLAlchemy. Dari dalam lingkungan Python anda di baris perintah, pasang SQLAlchemy dengan memasang pip arahan:

pip install SQLAlchemy-1.2.9

The 1.2.9 adalah nombor versi. Anda boleh tinggalkan ini untuk mendapatkan pakej terkini, tetapi adalah amalan yang baik untuk menjadi spesifik. Anda tidak tahu bila siaran baru boleh melanggar kod semasa anda.

Sekarang anda sudah bersedia untuk memulakan pengekodan. Anda mungkin perlu menyediakan pangkalan data anda untuk menerima sambungan Python, tetapi contoh berikut semuanya menggunakan SQLite pangkalan data dibuat dalam memori di bawah.

Model dalam SQLAlchemy

Salah satu komponen utama ORM adalah model . Ini adalah kelas Python yang menggariskan seperti apa jadual dan bagaimana ia berfungsi. Ini versi ORM dari BUAT JADUAL penyataan dalam SQL. Anda memerlukan model untuk setiap jadual dalam pangkalan data anda.

Buka editor teks kegemaran anda atau IDE, dan buat fail baru yang dipanggil test.py . Masukkan kod pemula ini, simpan fail, dan jalankan:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine('sqlite://') # Create the database in memory
Base.metadata.create_all(engine) # Create all the tables in the database

Kod ini melakukan beberapa perkara. Import diperlukan agar Python memahami di mana untuk mencari modul SQLAlchemy yang diperlukannya. Model anda akan menggunakan deklaratif_basis di kemudian hari, dan ia mengkonfigurasi model baru untuk berfungsi seperti yang diharapkan.

The create_engine kaedah membuat sambungan baru ke pangkalan data anda. Sekiranya anda sudah mempunyai pangkalan data, anda perlu mengubahnya sqlite: // ke URI pangkalan data anda. Seperti ini, kod ini akan membuat pangkalan data baru dalam memori sahaja. Pangkalan data dimusnahkan setelah kod anda selesai dijalankan.

Akhirnya, buat_semua kaedah membuat semua jadual yang ditentukan dalam mod anda dalam pangkalan data anda. Oleh kerana anda belum menentukan model apa pun, tidak akan berlaku apa-apa. Teruskan dan jalankan kod ini, untuk memastikan anda tidak menghadapi masalah atau kesalahan ketik.

Mari buat model. Tambahkan import lain ke bahagian atas fail anda:

from sqlalchemy import Column, Integer, String

Ini mengimport Ruangan , Bilangan bulat , dan Tali modul dari SQLAlchemy. Mereka menentukan bagaimana jadual, medan, lajur, dan jenis pangkalan data berfungsi.

Di bawahnya deklaratif_basis , buat kelas model anda:

class Cars(Base):
__tablename__ = 'cars'
id = Column(Integer, primary_key=True)
make = Column(String(50), nullable=False)
color = Column(String(50), nullable=False)

Contoh mudah ini menggunakan kereta, tetapi jadual anda mungkin mengandungi data apa pun.

Setiap kelas mesti mewarisi Pangkalan . Nama jadual pangkalan data anda ditentukan dalam __tablenama__ . Ini harus sama dengan nama kelas, tetapi ini hanya cadangan, dan tidak ada yang akan hancur jika tidak sesuai.

Akhirnya, setiap lajur ditakrifkan sebagai pemboleh ubah python di dalam kelas. Jenis data yang berbeza digunakan, dan kunci utama atribut memberitahu SQLAlchemy untuk membuat ID lajur sebagai kunci utama.

Teruskan dan tambahkan satu import terakhir, kali ini untuk Kunci asing modul. Tambahkan ini di sebelah anda Ruangan import:

from sqlalchemy import Column, ForeignKey, Integer, String

Sekarang buat kelas model kedua. Kelas ini dipanggil Pemilik Kereta , dan menyimpan butiran pemilik kereta tertentu yang disimpan di Kereta jadual:

class CarOwners(Base):
__tablename__ = 'carowners'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
age = Column(Integer, nullable=False)
car_id = Column(Integer, ForeignKey('cars.id'))
car = relationship(Cars)

Terdapat beberapa atribut baru yang diperkenalkan di sini. The kereta_id bidang ditakrifkan sebagai kunci asing. Ia dihubungkan dengan ID di dalam kereta meja. Perhatikan bagaimana nama jadual huruf kecil digunakan, contoh nama kelas huruf besar.

Akhirnya, atribut dari kereta ditakrifkan sebagai hubungan . Ini membolehkan model anda mengakses Kereta jadual melalui pemboleh ubah ini. Ini ditunjukkan di bawah.

Sekiranya anda menjalankan kod ini sekarang, anda akan melihat bahawa tidak ada yang berlaku. Ini kerana anda belum menyuruhnya melakukan perkara yang ketara.

Objek dalam SQLAlchemy

Setelah model anda dibuat, anda boleh mula mengakses objek, dan membaca dan menulis data. Adalah idea yang baik untuk meletakkan logik anda ke dalam kelas dan failnya sendiri, tetapi buat masa ini, logika ini dapat tetap berada di samping model.

Menulis Data

Dalam contoh ini, anda perlu memasukkan beberapa data ke dalam pangkalan data sebelum anda dapat membacanya. Sekiranya anda menggunakan pangkalan data yang ada, anda mungkin sudah mempunyai data. Walau bagaimanapun, masih sangat berguna untuk mengetahui cara memasukkan data.

Anda mungkin terbiasa menulis MASUKKAN penyataan dalam SQL. SQLAlchemy mengendalikan ini untuk anda. Inilah cara memasukkan satu baris ke dalam Kereta model. Mulakan dengan import baru untuk pembuat sesi :

from sqlalchemy.orm import sessionmaker

Ini diperlukan untuk membuat sesi dan DBSession objek, yang digunakan untuk membaca dan menulis data:

DBSession = sessionmaker(bind=engine)
session = DBSession()

Sekarang letakkan ini di bawah anda buat_semua penyataan:

car1 = Cars(
make='Ford',
color='silver'
)
session.add(car1)
session.commit()

Mari pecahkan kod itu. Pemboleh ubah kereta1 ditakrifkan sebagai objek berdasarkan Kereta model. Membuat dan warnanya ditetapkan sebagai parameter. Ini seperti mengatakan 'jadikan saya kereta, tetapi jangan menulisnya ke pangkalan data'. Kereta ini wujud dalam ingatan tetapi sedang menunggu untuk ditulis.

Tambahkan kereta ke sesi dengan sesi.add , dan kemudian tuliskan ke pangkalan data dengan sesi.commit .

Sekarang mari tambahkan pemilik:

owner1 = CarOwners(
name='Joe',
age='99',
car_id=(car1.id)
)
session.add(owner1)
session.commit()

Kod ini hampir sama dengan sisipan sebelumnya untuk Kereta model. Perbezaan utama di sini ialah kereta_id adalah kunci asing sehingga memerlukan id baris yang ada di jadual lain. Ini diakses melalui kereta1.id harta benda.

Anda tidak perlu membuat pertanyaan pada pangkalan data atau mengembalikan sebarang id, kerana SQLAlchemy menangani ini untuk anda (selagi anda melakukan data terlebih dahulu).

Membaca Data

Sebaik sahaja anda menulis beberapa data, anda boleh mula membacanya kembali. Inilah cara untuk pertanyaan Kereta dan Pemilik Kereta jadual:

result = session.query(Cars).all()

Ia semudah itu. Dengan menggunakan pertanyaan kaedah yang terdapat di sesi , anda menentukan model, dan kemudian gunakan semua kaedah untuk mendapatkan semua hasil. Sekiranya anda tahu hanya akan ada satu hasil, maka anda boleh menggunakan pertama kaedah:

result = session.query(Cars).first()

Setelah anda menanyakan model, dan menyimpan hasil yang dikembalikan dalam pemboleh ubah, anda dapat mengakses data melalui objek:

print(result[0].color)

Ini mencetak warna 'perak', kerana rekod itu adalah baris pertama. Anda boleh menggulung objek hasil jika anda mahu.

Semasa anda menentukan hubungan dalam model anda, ada kemungkinan untuk mengakses data dalam jadual yang berkaitan tanpa menentukan gabungan:

result = session.query(CarOwners).all()
print(result[0].name)
print(result[0].car.color)

Ini berfungsi kerana model anda mengandungi perincian struktur meja anda, dan kereta atribut didefinisikan sebagai pautan ke kereta meja.

Apa yang Tidak Suka Mengenai ORM?

Tutorial ini hanya merangkumi asas-asasnya, tetapi setelah anda mengetahui, anda boleh meneruskan topik lanjutan. Terdapat beberapa kelemahan yang berpotensi untuk ORM:

  • Anda mesti menulis model anda sebelum sebarang pertanyaan dapat dijalankan.
  • Ini satu lagi sintaks baru untuk dipelajari.
  • Mungkin terlalu rumit untuk keperluan sederhana.
  • Anda mesti mempunyai reka bentuk pangkalan data yang baik untuk bermula.

Masalah-masalah ini bukan masalah besar sendiri, tetapi perkara-perkara yang perlu diperhatikan. Sekiranya anda menggunakan pangkalan data yang ada, anda mungkin terperangkap.

Sekiranya anda tidak yakin bahawa ORM adalah alat yang tepat untuk anda, pastikan anda membaca mengenai yang penting diketahui oleh pengaturcara arahan SQL .

Berkongsi Berkongsi Tweet E-mel Sekiranya Anda Meningkatkan Ke Windows 11 Segera?

Windows 11 akan hadir tidak lama lagi, tetapi adakah anda perlu mengemas kini secepat mungkin atau menunggu beberapa minggu? Mari kita ketahui.

Baca Seterusnya
Topik-topik yang berkaitan
  • Pengaturcaraan
  • Python
  • SQL
  • Tutorial Pengekodan
Mengenai Pengarang Joe Coburn(136 Artikel Diterbitkan)

Joe adalah lulusan Sains Komputer dari University of Lincoln, UK. Dia seorang pembangun perisian profesional, dan ketika dia tidak terbang drone atau menulis muzik, dia sering didapati mengambil gambar atau menghasilkan video.

kaedah termudah untuk membuat carta alir
Lagi Dari Joe Coburn

Langgan buletin kami

Sertailah buletin kami untuk mendapatkan petua, ulasan, ebook percuma, dan tawaran eksklusif!

Klik di sini untuk melanggan