第十屆鐵人賽 flask-restful DAY25-搞懂如何處理flask-sqlalchemy在現有專案

實作flask-sqlalchemy

在昨日已經教授大家flask-sqlalchemy的一些基本語法,以及如何將flask-sqlalchemy導入專案之中,而今天就開始進一步介紹給大家如何在截至目前的程式碼中加入flask-sqlalchemy。

截至目前為止的UserModel

import sqlite3


class UserModel:
    name = ''
    email = ''
    password = ''
    id = 0

    def __init__(self, name, email, password):
        self.name = name
        self.email = email
        self.password = password

    def add_user(self):
        conn = sqlite3.connect('user.db')
        cursor = conn.cursor()
        insert_query = 'INSERT INTO users VALUES(?, ?, ?, ?)'
        cursor.execute(insert_query, (None, self.name,
                                      self.email, self.password))
        conn.commit()
        conn.close()

    def update_user(self):
        conn = sqlite3.connect('user.db')
        cursor = conn.cursor()
        update_query = 'UPDATE users SET name=?, email=?, password=? WHERE id=?'
        cursor.execute(update_query, (self.name,
                                      self.email, self.password, self.id))
        conn.commit()
        conn.close()

    @staticmethod
    def get_user(name):
        user = None
        conn = sqlite3.connect('user.db')
        cursor = conn.cursor()
        query_one_query = 'SELECT * FROM users WHERE name=?'
        result = cursor.execute(query_one_query, (name,)).fetchone()
        if result is None:
            return None
        user = UserModel(result[1], result[2], result[3])
        user.id = result[0]
        conn.close()
        return user

    @staticmethod
    def delete_user(name):
        conn = sqlite3.connect('user.db')
        cursor = conn.cursor()
        delete_query = 'DELETE FROM users WHERE name=?'
        cursor.execute(delete_query, (name,))
        conn.commit()
        conn.close()

    @staticmethod
    def get_all_user():
        users = []
        conn = sqlite3.connect('user.db')
        cursor = conn.cursor()
        query_one_query = 'SELECT * FROM users'
        for item in cursor.execute(query_one_query):
            user = UserModel(item[1], item[2], item[3])
            user.id = item[0]
            users.append(user)
        conn.close()
        return users

所以我們要做的是把所有sqlite的語法都拿掉,並且改用common.db來實作。

用flask-sqlalchemy實作UserModel

接下來會一個步驟一個步驟教大家如何在現有的專案中導入flask-sqlalchemy。

設計UserModel

首先先重新定義UserModel,內容如下

class UserModel(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(120))

    def __init__(self, name, email, password):
        self.name = name
        self.email = email
        self.password = password

在定義完UserModel後我們要開始實作CRUD了。

新增UserModel

這部分將昨日的課程套用在今天的實作上,請參考以下內容:

    def add_user(self):
        db.session.add(self)
        db.session.commit()

刪除UserModel

如同新增,刪除的作法也很簡單,請參考以下內容:

    def delete_user(self):
        db.session.delete(self)
        db.session.commit()

修改UserModel

比起新增、刪除來說修改的作法更簡單,請參考以下內容:

    def delete_user(self):
        db.session.commit()

透過使用者名稱來查詢UserModel

查詢相較知識比較困難一點,不過也沒有很難,詳細內容請參考下列範例:

    @classmethod
    def get_user(cls, name):
        return cls.query.filter_by(name=name).first()

查詢所有使用者資料

最後說明一個昨天沒有講到的東西,因為我們的專案會列出所有使用者的資料,這部分就需要透過下列方法取得資料了:

    @classmethod
    def get_all_user(cls):
        return cls.query.all()

設定資料庫

在實作完成之後就是要設定資料庫的部分了,所以這裡修改app.py加入以下內容即可:

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///user.db'

更改後的程式碼:

from common.db import db


class UserModel(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    password = db.Column(db.String(120))

    def __init__(self, name, email, password):
        self.name = name
        self.email = email
        self.password = password

    def add_user(self):
        db.session.add(self)
        db.session.commit()

    def update_user(self):
        db.session.commit()

    @classmethod
    def get_user(cls, name):
        return cls.query.filter_by(name=name).first()

    def delete_user(self):
        db.session.delete(self)
        db.session.commit()

    @classmethod
    def get_all_user(cls):
        return cls.query.all()

小結

今日的課程透過在現有的專案中實作flask-sqlalchemy,希望能夠讓讀者們更了解如何透過flask-sqlalchemy更便利的操作資料庫的內容。不過截至目前為止還沒說明如果資料庫還沒建立或是資料更新該如何處理,這部分明天會針對加以說明,敬請期待。

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *