在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即可看到表格內容。

注意事項

  1. 密碼安全:示例中密碼是明文存儲,生產環境必須用哈希算法(如bcrypt)加密!
   import bcrypt
   password = bcrypt.hashpw(request.form.get('password').encode('utf-8'), bcrypt.gensalt())
  1. SQL注入防護:示例中使用(?, ?)參數化查詢,避免直接拼接SQL字符串。
  2. 數據庫連接關閉:每次操作後務必關閉連接(conn.close()),避免資源泄露。
  3. 併發問題:簡單的SQLite連接在高併發下可能有問題,可使用with語句自動管理連接:
   with get_db_connection() as conn:
       conn.execute(...)
       conn.commit()

總結

SQLite作爲輕量級數據庫,是Python Web初學者學習數據存儲的理想選擇。通過本文,你已經掌握了:
- SQLite的基本概念和優勢
- 用Python操作SQLite的增刪改查基礎
- 結合Flask框架實現用戶信息的註冊與展示
- 如何驗證數據和查看數據庫內容

後續可以嘗試更復雜的功能,比如:
- 實現用戶登錄驗證(密碼比對)
- 使用ORM框架(如SQLAlchemy)簡化操作
- 處理數據庫遷移(如Alembic)
- 部署到服務器時考慮數據庫優化

SQLite雖小,但能解決Web開發中大部分基礎數據存儲需求,是學習數據持久化的第一步!

小夜