30-05-2017, Saat: 17:16
Flask framework'ü varsayılan olarak bir veritabanı ile gelmez. Bu geliştiricilere büyük bir esneklik sağlamaktadır. Bütün veritabanları ile çalışabilirsiniz.
Başlangıç için python ile gelen sqlite veritabanını kullanacağız. Hem dosya tabanlı olduğundan, server kurulumu yoktur, hemde taşınabilir olması büyük bir ayrıcalıktır.
ORM:
Object Relational Mapper. ORM kütüphaneleri aracılığıyla tablolarınızı sınıf olarak kodlarsınız, onlar bu sınıfları veritabanında tablolara haritalarlar. Python ekosisteminde oldukça popular olan SQLAlchemy bu orm kütüphanelerinden biridir. Bu ORM'nin Flask eklentiside mevcuttur.
Eklentiyi kurmak için:
Kod:
$ pip install flask-sqlalchemy
Not:
Bu eklentiyi kullanmadan da flask ile geliştireceğiniz uygulamanızda sqlalchemy kütüphanesini kullanabilirsiniz.
Şimdi örnek olarak bir sınıf oluşturalım ve flask-sqlalchemy eklentisi ile kullanalım:
Kod:
#hello.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(64), unique=True)
Tablolara karşılık gelecek olan sınıfların
Kod:
db.Model
sınıfından türetilmeleri gerekir.
Kod:
__tablename__
attribute'ü özel olarak tanımlanır ve tablo isimlendirilirken bu isim kullanılır. Sınıfın diğer özellikleri tablo alanlarına karşılık gelirler. Bu alanların veri tipleri yine eklentiden alınır.
Kod:
unique
, attributü o alanın tekil olmasını sağlar, tabloya aynı veri girilmesi durumunda hata verir.
Kod:
autoincrement
, otomatik artacak değeri arttırılması istenen sütüna verilebilir.
Kod:
primary_key
, o alanı birincil anahtar yapar.
Bu sınıfın tablo olarak oluşturulacağı veritabanı belirtilmelidir. Sqlite için
Kod:
SQLALCHEMY_DATABASE_URI
:
Kod:
app.config.update(
SQLALCHEMY_DATABASE_URI = 'sqlite:///data.sqlite',
SECRET_KEY = "g.i/r5h)s-kc"
)
mysql için:
Kod:
SQLALCHEMY_DATABASE_URI = 'mysql+driver://user:passwor@host/dbname'
postgresql için:
Kod:
SQLALCHEMY_DATABASE_URI = 'postgresql+driver://user:passwor@host/dbname'
örnek olarak mysql ve postgresql için de yapılandıralım:
Kod:
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://metmirr:12345@localhost/testdb'
SQLALCHEMY_DATABASE_URI = 'postgresql+psycopg2://metmirr:12345@localhost/testdb'
driverları yüklemek için:
Kod:
$pip install pymysql
$pip install psycopg2
Not: Sqlite hariç belirtilen veritabanları oluşturulmuş olmalıdır. Oluşturulan bu sınıfların tablolara dönüştürülmesi için
Kod:
db.create_all()
metodu çağrılmalıdır. Ek olarak sqlalchemy kendisi yüklü olan bu driverları kullanır, herhangi bir import işlemi yapmanıza gerek yoktur.
Veri tabanı için tam kod:
Kod:
#hello.py
from flask import Flask
from flask_script import Manager
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
manager = Manager(app)
db = SQLAlchemy(app)
app.config.update(
SQLALCHEMY_DATABASE_URI = 'sqlite:///data.sqlite',
SECRET_KEY = "g.i/r5h)s-kc"
)
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(64), unique=True)
@app.route('/')
def index():
return "index page"
if __name__ == '__main__':
manager.run()
Şimdi uygulamamız hazır durumda ancak tablomuz oluşturlmadı henüz, oluşturmak için:
Kod:
$ python hello.py shell
> from hello import db
> db.create_all()
Tablolar oluşturuldu. Kayıt ekleyelim:
Kod:
$ python hello.py shell
> from hello import User, db
> user = User(username="mtndmr")
> db.session.add(user)
> db.session.commit()
>
> # Sorgulama yapalım
> u = User.query.filter_by(username="mtndmr")
> u.username
mtndmr
> u.id
1
Kayıt eklemek için model sınıfın örneği oluşturulup ayrı ayrı alan değerleri verilebilir:
Kod:
> user = User()
> user.username = "mtndmr"
> db.session.add(user)
> db.session.commit()
yada örneğimizde direk model sınıfının yapılandırıcısına verilebilir.
Kod:
session
nesnesi nesneyi veritabanına eklemek için tutar.
Kod:
commit()
metodu ile nesne veritabanına işlenir.