昨日的教程教授大家如何使用sqlite讓使用者資料不再是儲存在記憶體內,今日要教授大家的是如何整合sqlite到我們的應用程序內。
本文同步放置於此
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
昨日教授大家如何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()
這兩部分。
在處理完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來改善以上問題,敬請期待。
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))
感謝指正