Merih Forum Programlama ve yazılım algoritmalar programlama python Flask Flask-sqlalchemy ile tablo oluşturma, tablolar arasında ilişki tanımlama

  • 0 Oy - 0 Ortalama
  • 1
  • 2
  • 3
  • 4
  • 5
Flask-sqlalchemy ile tablo oluşturma, tablolar arasında ilişki tanımlama

 
#1

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).




Bul
Alıntı


Benzer Konular...
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  Flask ile örnek bir uygulama altyapısı efsane 1 3,120 30-05-2017, Saat: 18:14
Son Mesaj: dalaylama
  database migration, Flask-migrate eklentisi efsane 0 2,285 30-05-2017, Saat: 17:21
Son Mesaj: efsane
  sqlalchemy tablo sorgulama filtreleri ve sorgu çalıştırıcılar efsane 0 2,305 30-05-2017, Saat: 17:20
Son Mesaj: efsane
  Flask-sqlalchemy eklentisi, sütun veri tipleri efsane 0 2,231 30-05-2017, Saat: 17:18
Son Mesaj: efsane
  flask uygulamasına veritabanı ekleme sqlalchemy, orm efsane 0 2,720 30-05-2017, Saat: 17:16
Son Mesaj: efsane

Digg   Delicious   Reddit   Facebook   Twitter   StumbleUpon  


Bu konuyu görüntüleyen kullanıcı(lar):
1 Ziyaretçi

   
Türkçe Çeviri: Emre KRMN, Kodlayanlar MyBB, © 2002-2024 MyBB Group.  



Merih Forum® bilgi paylaşım platformu. 2015-∞ Tüm hakları saklıdır.