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