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

現有專案加入sqlite

昨日的教程教授大家如何使用sqlite讓使用者資料不再是儲存在記憶體內,今日要教授大家的是如何整合sqlite到我們的應用程序內。

截至目前為止的UserModel


users = []

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

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

    def add_user(self):
        users.append(self)

    @staticmethod
    def get_user(name):
        find = [item for item in users if item.name == name]
        if len(find) == 0:
            return None
        return find[0]

    @staticmethod
    def delete_user(name):
        global users
        users = [item for item in users if item.name != name]

    @staticmethod
    def get_all_user():
        return users

修改UserModel

昨日教授大家如何insert大批使用者資料,不過目前不太會用到該指令,其實比較會用到的是execute,內容依功能別介紹如下:

新增

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

刪除

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

查詢

查詢的部分可以分成兩個內容一個是查詢單一使用者,另一個是查詢所有使用者

查詢單一使用者

    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

其中fetchone()`就是僅查詢一筆資料,若無資料則會返還`None

查詢所有使用者

    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

看過上述的解說後讀者不難發現訣竅在於execute`透過第二個參數來傳遞參數`(name,)`,以及查詢一筆使用`fetchone()這兩部分。

修改User這個Resource

在處理完UserModel後我們在針對User這Resource調整些許部分,調整後的結果如下:

    def put(self, name):
        result = user_schema.load(get_param())
        if len(result.errors) > 0:
            return result.errors, 433

        user = UserModel.get_user(name)
        if not user:
            return {
                'message': 'username not exist!'
            }, 403
        user.email = result.data['email']
        user.password = result.data['password']
        user.update_user()
        return {
            'message': 'Update user success',
            'user': user_schema.dump(user).data
        }

所以經過重構後我們僅需要調整put的做法即可。

注意事項

寫好程式碼後在執行專案前有個注意事項要提醒大家,請千萬注意要先CREATE TABLE,否則後續的CRUD會失敗。再來就是注意user.db的位置因為這與執行程序的位置有關。若是有所不同請試著調整connect位置或是python執行app.py的指令。以上注意事項後續會使用其他函式庫來改善。

小結

今日的教程教授大家如何將昨日的sqlite教程應用在我們的應用程序當中,但是直接使用不是那麼直覺,而且程式碼又夾雜SQL指令所以維護上不方便,所以明日在教授大家如何使用SQLALCHEMY來改善以上問題,敬請期待。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *