在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开发中大部分基础数据存储需求,是学习数据持久化的第一步!

小夜