30-05-2017, Saat: 17:19
SQLAlchemy kullanılarak tanımlanan sınıflar arasında ilişkiler tanımlanabilir. Bu ilişkiler sql de tablolar arasındaki ilişkilere karşılık gelirler.
Kod:
from flask_sqlalchemy import SQLAlchemy
#...
db = SQLAlchemy(app)
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
users = db.relationship('User', backref='role')
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True)
#ikincil anahtar, her kullanıcının bir rolü olduğu için
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
Yukarıda tanımlanan iki sınıf arasındaki ilişki bire-çok ilişkisidir. Her kullanıcının bir rolü vardır ve aynı role sahip bir çok kullanıcı olabilir. Bu ilişkiyi tanımlayan satırlardan ilki olan:
Kod:
users = db.relationship('User', backref='role')
satırı
Kod:
User
sınıfına
Kod:
role
isminde bir nesne ekler böylece her kullanıcı için bir role nesnesi vardır, yani kodla gösterirsek:
Kod:
user = User.query.filter_by(username='mtndmr').first()
user.role #role nesnesi, yani Role sınıfının bir instance
user.role.name #kullanıcının sahip olduğu rolün ismini verir
user.role.id #bu rolün idsini verir
user.username #kullanıcının kullanıcı adını verir
Ve
Kod:
Role
sınıfına eklenen bu özellikle aynı role sahip bütün kullanıcılar görüntülenebilir. Örnek olarak rolü admin olanları göstermek için aşağıdaki gibi bir kod yazılabilir:
Kod:
role = Role.query.filter_by(name='Admin').first()
role.users.count() #admin olan kullanıcıların sayısını verir
all_user = role.users.all() #kullanıcıların hepsine erişebiliriz.
for user in all_user:
print(user.id, user.username)
Kod:
User
sınıfında yer alan
Kod:
roler_id
sütünü her kullanıcı için o kullanıcının role id'sini tutar. Böylece role id'si bilinen bir kullanıcının rolü öğrenilebilir.
Kod:
ForeignKey
(ikincil anahtar) olarak belirlenen sütün diğer tablodaki primary key sütünü olmalıdır. Yeni kullanıcı kaydı yapıldığında bu kullanıcının
Kod:
rolu_id
'si verildiğinde bu id değeri
Kod:
roles
tablosunda mevcut değilse hata alınır. Çünkü ikincil(foreignkey) anahtarlar diğer tablolara bir referenstır. Örnek olarak gösterelim:
Kod:
user = User(username='mtndmr', role_id=1) #yeni kullanıcı kaydı
db.session.add(user)
db.session.commit()
Oluşturulan bu kullanıcının role_id'si başka bir yolla belirlenebilir. Çünkü bizim User sınıfı
Kod:
role
isminde bir nesne tutar ve bu nesne Role sınıfının bir instance'sına referanstır yani:
Kod:
role = Role.query.filter_by(name='Admin').first() #admin rolü alınıyor.
role.name #Admin
user = User(username='mtndmr', role=role)
db.session.add(user)
db.session.commit()
user.role_id #Admin'nin role idsi olacaktır.
yukarıdaki
Kod:
role=role
işlemi kulanıcıya role_id'sini otomatik olarak atar.
backref:
Kod:
relationship()
metoduna verilen bu parametre User sınıfına tersi yönde bir ilişki oluşturur. Yani kullanıcı aracılığıyla rolün ismine idsine erişebiliriz(user.role.name).