SQLAlchemy ORM - Membangun Hubungan
Sesi ini menjelaskan pembuatan tabel lain yang terkait dengan yang sudah ada di database kita. Tabel pelanggan berisi data master pelanggan. Sekarang kita perlu membuat tabel faktur yang mungkin memiliki sejumlah faktur milik pelanggan. Ini adalah kasus hubungan satu ke banyak.
Menggunakan deklaratif, kami mendefinisikan tabel ini bersama dengan kelas yang dipetakannya, Faktur seperti yang diberikan di bawah ini -
from sqlalchemy import create_engine, ForeignKey, Column, Integer, String
engine = create_engine('sqlite:///sales.db', echo = True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy.orm import relationship
class Customer(Base):
__tablename__ = 'customers'
id = Column(Integer, primary_key = True)
name = Column(String)
address = Column(String)
email = Column(String)
class Invoice(Base):
__tablename__ = 'invoices'
id = Column(Integer, primary_key = True)
custid = Column(Integer, ForeignKey('customers.id'))
invno = Column(Integer)
amount = Column(Integer)
customer = relationship("Customer", back_populates = "invoices")
Customer.invoices = relationship("Invoice", order_by = Invoice.id, back_populates = "customer")
Base.metadata.create_all(engine)
Ini akan mengirim kueri CREATE TABLE ke mesin SQLite seperti di bawah ini -
CREATE TABLE invoices (
id INTEGER NOT NULL,
custid INTEGER,
invno INTEGER,
amount INTEGER,
PRIMARY KEY (id),
FOREIGN KEY(custid) REFERENCES customers (id)
)
Kami dapat memeriksa bahwa tabel baru dibuat di sales.db dengan bantuan alat SQLiteStudio.
Kelas faktur menerapkan konstruksi ForeignKey pada atribut custid. Petunjuk ini menunjukkan bahwa nilai di kolom ini harus dibatasi menjadi nilai yang ada di kolom id di tabel pelanggan. Ini adalah fitur inti dari database relasional, dan merupakan "perekat" yang mengubah kumpulan tabel yang tidak terhubung menjadi memiliki hubungan yang kaya tumpang tindih.
Direktif kedua, yang dikenal sebagai hubungan (), memberi tahu ORM bahwa kelas Faktur harus ditautkan ke kelas Pelanggan menggunakan atribut Invoice.customer. Relasi () menggunakan relasi kunci asing antara dua tabel untuk menentukan sifat keterkaitan ini, menentukan bahwa itu banyak berbanding satu.
Direktif hubungan tambahan () ditempatkan pada kelas yang dipetakan Pelanggan di bawah atribut Customer.invoices. Parameter relasi.back_populates ditetapkan untuk merujuk ke nama atribut pelengkap, sehingga setiap relasi () dapat membuat keputusan cerdas tentang relasi yang sama seperti yang diekspresikan secara terbalik. Di satu sisi, Faktur.customer mengacu pada contoh Faktur, dan di sisi lain, Faktur Pelanggan mengacu pada daftar contoh Pelanggan.
Fungsi relasi adalah bagian dari API Relasi dari paket SQLAlchemy ORM. Ini menyediakan hubungan antara dua kelas yang dipetakan. Ini sesuai dengan hubungan tabel induk-anak atau asosiatif.
Berikut adalah Pola Hubungan dasar yang ditemukan -
Satu Untuk Banyak
Hubungan One to Many mengacu pada induk dengan bantuan kunci asing pada tabel anak. hubungan () kemudian ditentukan pada induk, sebagai referensi kumpulan item yang diwakili oleh anak. Parameter relationship.back_populates digunakan untuk membuat hubungan dua arah dalam satu-ke-banyak, dengan sisi "kebalikan" adalah banyak ke satu.
Banyak Untuk Satu
Di sisi lain, hubungan Many to One menempatkan kunci asing di tabel induk untuk merujuk ke anak. hubungan () dideklarasikan di induk, di mana atribut penahan skalar baru akan dibuat. Di sini sekali lagi parameter relationship.back_populates digunakan untuk Bidirectionalbehaviour.
Satu Untuk Satu
Hubungan One To One pada dasarnya adalah hubungan dua arah. Bendera uselist menunjukkan penempatan atribut skalar alih-alih koleksi di sisi "banyak" dari hubungan. Untuk mengonversi satu-ke-banyak menjadi jenis relasi satu-ke-satu, setel parameter uselist ke false.
Banyak ke banyak
Hubungan Banyak ke Banyak dibuat dengan menambahkan tabel asosiasi yang terkait dengan dua kelas dengan mendefinisikan atribut dengan kunci asingnya. Ini ditunjukkan oleh argumen sekunder ke relationship (). Biasanya, Tabel menggunakan objek MetaData yang terkait dengan kelas dasar deklaratif, sehingga direktif ForeignKey dapat menemukan tabel jarak jauh yang akan ditautkan. Parameter relationship.back_populates untuk setiap hubungan () membentuk hubungan dua arah. Kedua sisi hubungan itu berisi kumpulan.