iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 24
1

現有專案加入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來改善以上問題,敬請期待。


上一篇
DAY22-搞懂如何導入sqlite
下一篇
DAY24-搞懂如何導入flask-SQLAlchemy
系列文
瓶子裡裝甚麼藥,使用Flask輕輕鬆鬆打造一個RESTful API31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

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

insert_query = 'INSERT INTO exchanges VALUES(?, ?, ?, ?)'
exchanges table 是 users table嗎?

cursor.execute(insert_query, None, self.name, self.email, self.password)
少了括號
cursor.execute(insert_query, (None, self.name, self.email, self.password))

kirai iT邦新手 4 級 ‧ 2019-09-26 21:17:01 檢舉

感謝指正

我要留言

立即登入留言