在Web開發中,我們經常需要存儲用戶的註冊信息、登錄狀態、個人數據等。如果沒有數據存儲,用戶刷新頁面後信息就會丟失,這就像寫日記時不用本子記,寫完就忘。而SQLite是一種輕量級的數據庫,非常適合初學者快速上手,因爲它不需要額外安裝服務器,直接用文件就能存儲數據,就像一個“本地小倉庫”。
爲什麼用SQLite?¶
SQLite是Python的內置模塊,安裝Python後就能直接使用,不需要額外配置服務器。它適合小型項目或開發階段的應用,因爲:
- 不需要安裝額外的數據庫服務器,直接操作本地文件
- 語法簡單,容易理解
- 支持基本的SQL語句,學習成本低
- 對初學者友好,能快速實現數據持久化
環境準備¶
我們需要用到Python的Flask框架(輕量級Web框架,適合入門),以及SQLite(Python自帶,無需額外安裝)。先確保安裝了Flask:
pip install flask
創建數據庫和用戶表¶
首先,我們需要一個地方來存儲用戶信息,這就是“數據庫”和“表”。SQLite用文件作爲數據庫,表則類似Excel表格,用來組織不同字段的信息。
步驟1:連接數據庫並創建表¶
新建一個Python文件(比如app.py),先導入必要的庫:
import sqlite3
from flask import Flask, request, render_template_string
然後初始化Flask應用,並定義一個函數創建數據庫和用戶表。用戶表至少需要:
- id:唯一標識,自增整數(不用手動輸入)
- username:用戶名(唯一,不重複)
- password:密碼(這裏先簡單處理,實際項目要加密!)
- email:郵箱(可選)
app = Flask(__name__)
# 連接數據庫的函數,返回數據庫連接和遊標
def get_db_connection():
conn = sqlite3.connect('user_database.db') # 數據庫文件名爲user_database.db
conn.row_factory = sqlite3.Row # 讓查詢結果以字典形式返回,方便操作
return conn
# 創建用戶表(只執行一次,之後註釋掉防止重複創建)
def init_db():
conn = get_db_connection()
# 創建用戶表的SQL語句
conn.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password TEXT NOT NULL,
email TEXT
)
''')
conn.commit()
conn.close()
# 程序啓動時初始化數據庫(只運行一次,之後註釋掉)
init_db()
小提示:CREATE TABLE IF NOT EXISTS 表示如果表不存在才創建,避免重複執行報錯。AUTOINCREMENT 表示id會自動遞增,不需要手動輸入。
用Python操作數據庫:增刪改查¶
現在我們實現用戶註冊和查看用戶列表的功能,這是最常見的兩個操作。
1. 註冊用戶(新增數據)¶
用戶在網頁填寫用戶名、密碼、郵箱,點擊提交後,數據要保存到數據庫。我們用Flask的路由處理POST請求:
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
# 從表單獲取用戶輸入
username = request.form.get('username')
password = request.form.get('password')
email = request.form.get('email', '') # 郵箱可選,默認空字符串
# 連接數據庫並插入數據
conn = get_db_connection()
conn.execute('INSERT INTO users (username, password, email) VALUES (?, ?, ?)',
(username, password, email))
conn.commit() # 提交事務,保存數據
conn.close()
return "註冊成功!<a href='/users'>查看用戶列表</a>"
else:
# GET請求時顯示註冊表單
return render_template_string('''
<form method="POST">
用戶名:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
郵箱:<input type="email" name="email"><br>
<button type="submit">註冊</button>
</form>
''')
2. 顯示用戶列表(查詢數據)¶
註冊後,我們需要查看所有用戶信息,這是查詢操作:
@app.route('/users')
def show_users():
conn = get_db_connection()
# 查詢所有用戶,按id排序
users = conn.execute('SELECT * FROM users ORDER BY id').fetchall()
conn.close()
# 將用戶數據渲染到HTML頁面
user_list = '<h1>用戶列表</h1><ul>'
for user in users:
user_list += f'<li>ID: {user["id"]}, 用戶名: {user["username"]}, 郵箱: {user["email"]}</li>'
user_list += '</ul>'
return user_list
3. 完整代碼整合¶
把上述代碼整合到app.py中,完整代碼如下:
import sqlite3
from flask import Flask, request, render_template_string
app = Flask(__name__)
# 數據庫連接函數
def get_db_connection():
conn = sqlite3.connect('user_database.db')
conn.row_factory = sqlite3.Row # 結果以字典形式返回
return conn
# 初始化數據庫表(僅首次運行)
def init_db():
conn = get_db_connection()
conn.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE,
password TEXT NOT NULL,
email TEXT
)
''')
conn.commit()
conn.close()
init_db() # 執行一次即可,之後可註釋
# 註冊頁面
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
email = request.form.get('email', '')
conn = get_db_connection()
# 插入數據,使用參數化查詢防止SQL注入(重要!)
conn.execute('INSERT INTO users (username, password, email) VALUES (?, ?, ?)',
(username, password, email))
conn.commit()
conn.close()
return f"註冊成功!<a href='/users'>查看用戶列表</a>"
else:
return '''
<form method="POST">
用戶名:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
郵箱:<input type="email" name="email"><br>
<button type="submit">註冊</button>
</form>
'''
# 用戶列表頁面
@app.route('/users')
def show_users():
conn = get_db_connection()
users = conn.execute('SELECT * FROM users ORDER BY id').fetchall()
conn.close()
result = '<h1>用戶列表</h1>'
for user in users:
result += f'''
<div>
<p>ID: {user['id']}</p>
<p>用戶名: {user['username']}</p>
<p>郵箱: {user['email']}</p>
</div>
'''
return result
if __name__ == '__main__':
app.run(debug=True)
驗證數據並查看數據庫¶
運行程序:
python app.py
然後訪問 http://127.0.0.1:5000/register,填寫信息提交後,再訪問 http://127.0.0.1:5000/users 查看是否顯示新用戶。
查看數據庫文件¶
SQLite的數據保存在user_database.db文件中,你可以用工具查看內容:
- 方法1:用Python代碼打印數據(臨時調試):
def print_users():
conn = get_db_connection()
users = conn.execute('SELECT * FROM users').fetchall()
for user in users:
print(dict(user)) # 打印成字典格式
conn.close()
print_users()
- 方法2:用可視化工具(推薦):下載 DB Browser for SQLite,打開
user_database.db即可看到表格內容。
注意事項¶
- 密碼安全:示例中密碼是明文存儲,生產環境必須用哈希算法(如
bcrypt)加密!
import bcrypt
password = bcrypt.hashpw(request.form.get('password').encode('utf-8'), bcrypt.gensalt())
- SQL注入防護:示例中使用
(?, ?)參數化查詢,避免直接拼接SQL字符串。 - 數據庫連接關閉:每次操作後務必關閉連接(
conn.close()),避免資源泄露。 - 併發問題:簡單的SQLite連接在高併發下可能有問題,可使用
with語句自動管理連接:
with get_db_connection() as conn:
conn.execute(...)
conn.commit()
總結¶
SQLite作爲輕量級數據庫,是Python Web初學者學習數據存儲的理想選擇。通過本文,你已經掌握了:
- SQLite的基本概念和優勢
- 用Python操作SQLite的增刪改查基礎
- 結合Flask框架實現用戶信息的註冊與展示
- 如何驗證數據和查看數據庫內容
後續可以嘗試更復雜的功能,比如:
- 實現用戶登錄驗證(密碼比對)
- 使用ORM框架(如SQLAlchemy)簡化操作
- 處理數據庫遷移(如Alembic)
- 部署到服務器時考慮數據庫優化
SQLite雖小,但能解決Web開發中大部分基礎數據存儲需求,是學習數據持久化的第一步!