SQLAlchemy Core - Birden Çok Tablo Kullanma
RDBMS'nin önemli özelliklerinden biri de tablolar arasında ilişki kurmaktır. İlgili tablolar üzerinde SELECT, UPDATE ve DELETE gibi SQL işlemleri gerçekleştirilebilir. Bu bölümde SQLAlchemy kullanılarak yapılan bu işlemler açıklanmaktadır.
Bu amaçla SQLite veritabanımızda (college.db) iki tablo oluşturulmuştur. Öğrenci tablosu bir önceki bölümde verilen yapıya sahiptir; adres tablosunda isest_id eşlenen sütun id column in students table yabancı anahtar kısıtlaması kullanarak.
Aşağıdaki kod, college.db'de iki tablo oluşturacaktır -
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, ForeignKey
engine = create_engine('sqlite:///college.db', echo=True)
meta = MetaData()
students = Table(
'students', meta,
Column('id', Integer, primary_key = True),
Column('name', String),
Column('lastname', String),
)
addresses = Table(
'addresses', meta,
Column('id', Integer, primary_key = True),
Column('st_id', Integer, ForeignKey('students.id')),
Column('postal_add', String),
Column('email_add', String))
meta.create_all(engine)
Yukarıdaki kod, öğrenciler için CREATE TABLE sorgularına ve aşağıdaki gibi adres tablosuna çevrilecek -
CREATE TABLE students (
id INTEGER NOT NULL,
name VARCHAR,
lastname VARCHAR,
PRIMARY KEY (id)
)
CREATE TABLE addresses (
id INTEGER NOT NULL,
st_id INTEGER,
postal_add VARCHAR,
email_add VARCHAR,
PRIMARY KEY (id),
FOREIGN KEY(st_id) REFERENCES students (id)
)
Aşağıdaki ekran görüntüleri yukarıdaki kodu çok açık bir şekilde göstermektedir -
Bu tablolar, çalıştırılarak verilerle doldurulur. insert() methodtablo nesneleri. Öğrenci tablosuna 5 satır eklemek için aşağıda verilen kodu kullanabilirsiniz -
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///college.db', echo = True)
meta = MetaData()
conn = engine.connect()
students = Table(
'students', meta,
Column('id', Integer, primary_key = True),
Column('name', String),
Column('lastname', String),
)
conn.execute(students.insert(), [
{'name':'Ravi', 'lastname':'Kapoor'},
{'name':'Rajiv', 'lastname' : 'Khanna'},
{'name':'Komal','lastname' : 'Bhandari'},
{'name':'Abdul','lastname' : 'Sattar'},
{'name':'Priya','lastname' : 'Rajhans'},
])
Rows aşağıdaki kod yardımı ile adres tablosuna eklenir -
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///college.db', echo = True)
meta = MetaData()
conn = engine.connect()
addresses = Table(
'addresses', meta,
Column('id', Integer, primary_key = True),
Column('st_id', Integer),
Column('postal_add', String),
Column('email_add', String)
)
conn.execute(addresses.insert(), [
{'st_id':1, 'postal_add':'Shivajinagar Pune', 'email_add':'[email protected]'},
{'st_id':1, 'postal_add':'ChurchGate Mumbai', 'email_add':'[email protected]'},
{'st_id':3, 'postal_add':'Jubilee Hills Hyderabad', 'email_add':'[email protected]'},
{'st_id':5, 'postal_add':'MG Road Bangaluru', 'email_add':'[email protected]'},
{'st_id':2, 'postal_add':'Cannought Place new Delhi', 'email_add':'[email protected]'},
])
Adresler tablosundaki st_id sütununun öğrenciler tablosundaki id sütununa başvurduğuna dikkat edin. Artık bu ilişkiyi her iki tablodan da veri almak için kullanabiliriz. Getirmek istiyoruzname ve lastname adres tablosundaki st_id'ye karşılık gelen öğrenciler tablosundan.
from sqlalchemy.sql import select
s = select([students, addresses]).where(students.c.id == addresses.c.st_id)
result = conn.execute(s)
for row in result:
print (row)
Seçilen nesneler, ortak ilişki üzerine iki tabloyu birleştiren aşağıdaki SQL ifadesine etkili bir şekilde çevrilir -
SELECT students.id,
students.name,
students.lastname,
addresses.id,
addresses.st_id,
addresses.postal_add,
addresses.email_add
FROM students, addresses
WHERE students.id = addresses.st_id
Bu, her iki tablodan aşağıdaki gibi karşılık gelen verileri çıkaran çıktı üretecektir -
(1, 'Ravi', 'Kapoor', 1, 1, 'Shivajinagar Pune', '[email protected]')
(1, 'Ravi', 'Kapoor', 2, 1, 'ChurchGate Mumbai', '[email protected]')
(3, 'Komal', 'Bhandari', 3, 3, 'Jubilee Hills Hyderabad', '[email protected]')
(5, 'Priya', 'Rajhans', 4, 5, 'MG Road Bangaluru', '[email protected]')
(2, 'Rajiv', 'Khanna', 5, 2, 'Cannought Place new Delhi', '[email protected]')