12/08/2018, 13:25

Tutorial : Sử dụng flask cho người mới bắt đầu ( Phần 4)

Trong tutorial trước chúng ta biết cách tạo form đăng nhập cho ứng dung. Phần tiếp theo sẽ hướng dẫn tạo database và thực hiện truy vấn bằng sqlAlchemy. Sqlalchemy là một ORM backend cho python cũng giống như doctrine cho PHP, giúp chúng ta có thể truy vấn cơ sở dữ liệu mà ko cần phải viết các ...

Trong tutorial trước chúng ta biết cách tạo form đăng nhập cho ứng dung. Phần tiếp theo sẽ hướng dẫn tạo database và thực hiện truy vấn bằng sqlAlchemy.

Sqlalchemy là một ORM backend cho python cũng giống như doctrine cho PHP, giúp chúng ta có thể truy vấn cơ sở dữ liệu mà ko cần phải viết các query bằng SQLLite. Ta cần thêm package để có thể tương tác với SQLLite từ python + package flask-sqlalchemy giúp ta setup nhanh chóng. Chúng ta config nhanh chóng trong file config.py:

import os
basedir = os.path.abspath(os.path.dirname(__file__))

SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'app.db')
SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository')

Ở đây SQLALCHEMY_DATABASE_URI thiết lập cho đường dẫn Flask-SQLAlchemy.

SQLALCHEMY_MIGRATE_REPO là nơi folder chứa dữ liệu SQLAlchemy-migrate.

Tiếp theo là khai báo khởi tạo cho database của chúng ta. trong file app/__init__.py:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config.from_object('config')
db = SQLAlchemy(app)

from app import views, models

Như vậy chúng ta đã hoàn thành khai báo để sử dụng sqlAlchemy. Chúng ta sẽ tiếp tục để khai báo xây dựng các bảng cho ứng dụng blog.

Xây dựng database

Để xây dựng blog tôi sẽ bắt đầu xây dựng model User(file app/models.py):

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nickname = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)

    def __repr__(self):
        return '<User %r>' % (self.nickname)

Class User chúng ta tạo ra bao gồm fields, xác đinh như các biến class: nickname và email.

phương thức __repr__ giúp khi chúng ta print đối tượng User.

Như vậy chúng ta đã có đối tượng User. Để tạo ra dữ bảng User trong database chúng ta sẽ chạy script:

./db_create.py

Tìm hiểu qua về file db_create.py, script tạo migration APIs:

#!flask/bin/python
from migrate.versioning import api
from config import SQLALCHEMY_DATABASE_URI
from config import SQLALCHEMY_MIGRATE_REPO
from app import db
import os.path
db.create_all()
if not os.path.exists(SQLALCHEMY_MIGRATE_REPO):
    api.create(SQLALCHEMY_MIGRATE_REPO, 'database repository')
    api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO)
else:
    api.version_control(SQLALCHEMY_DATABASE_URI, SQLALCHEMY_MIGRATE_REPO, api.version(SQLALCHEMY_MIGRATE_REPO))

Xây dựng Database relationship

Trong ứng dụng blog mỗi quan hệ giữa User và Postlà 1..n. Ở trong bảng Post sẽ có trường user_id. Khai báo bảng Post trong (app/model.py):

from app import db

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    nickname = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    posts = db.relationship('Post', backref='author', lazy='dynamic')

    def __repr__(self):
        return '<User %r>' % (self.nickname)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    body = db.Column(db.String(140))
    timestamp = db.Column(db.DateTime)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    def __repr__(self):
        return '<Post %r>' % (self.body)

Cuối cùng chúng ta migrations lại dữ liệu. chúng ta sẽ hoàn thành việc xây dựng 2 bảng User và Post:

$ ./db_migrate.py

Tổng kết

Ở tutorial này chúng ta đã biết cách xây dựng database trong framework với sqlAlchemy. Chúng ta đã xây dựng được bảng User và Post. Trong phần tiếp theo tôi sẽ viết bài về xây dựng login vào hệ thống.

0