Flask界面数据库怎么连接,有哪些方法?
- 云服务器
- 2026-07-24
- 17
Flask 与数据库的集成
Flask 是一个轻量级 Python Web 框架,本身不提供数据库支持,但通过扩展可轻松与数据库交互,最常见的方式是使用 Flask-SQLAlchemy,它整合了 SQLAlchemy ORM,简化了数据库操作。
安装与配置
首先安装所需扩展:
pip install flask flask-sqlalchemy
在 Flask 应用中配置数据库连接,例如使用 SQLite:
from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app)
定义模型
模型对应数据库表,继承 db.Model:

创建表:在 Python 交互环境或应用上下文中执行 db.create_all()。
构建界面与数据库操作
通过 Flask 路由函数执行 CRUD 操作,并利用模板渲染结果显示给用户。
新增数据(Create)
@app.route('/add_user') def add_user(): user = User(username='test', email='test@example.com') db.session.add(user) db.session.commit() return 'User added'
查询数据(Read)
@app.route('/users') def users(): all_users = User.query.all() return render_template('users.html', users=all_users)
模板示例(users.html):

更新与删除(Update / Delete)
@app.route('/update_user/<int:id>') def update_user(id): user = User.query.get(id) user.username = 'new_name' db.session.commit() return 'User updated' @app.route('/delete_user/<int:id>') def delete_user(id): user = User.query.get(id) db.session.delete(user) db.session.commit() return 'User deleted'
使用表单处理用户输入
集成 Flask-WTF 和 WTForms 可以更安全地处理表单数据:
from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import DataRequired class UserForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) email = StringField('Email', validators=[DataRequired()]) submit = SubmitField('Add User')
在模板中渲染表单,并在路由中验证和保存数据。
常见数据库类型与配置
| 数据库 | URI 格式示例 |
|---|---|
| SQLite | sqlite:///path/to/db.sqlite |
| PostgreSQL | postgresql://user:pass@localhost/mydb |
| MySQL | mysql://user:pass@localhost/mydb |
相关优化建议
- 迁移管理:使用 Flask-Migrate 基于 Alembic 管理数据库版本变更。
- 连接池:生产环境建议使用数据库连接池(如 SQLAlchemy 内置)。
- 安全性:避免 SQL 载入,始终使用 ORM 或参数化查询。
相关问题与解答
问题 1:Flask 中如何连接多个数据库?
可以通过配置多个 SQLALCHEMY_BINDS 实现。
app.config['SQLALCHEMY_BINDS'] = { 'users': 'sqlite:///users.db', 'posts': 'sqlite:///posts.db' }
在模型中使用 __bind_key__ 属性指定绑定:
class User(db.Model): __bind_key__ = 'users' # ... class Post(db.Model): __bind_key__ = 'posts' # ...
操作时,Flask-SQLAlchemy 会自动路由到正确的数据库。
问题 2:Flask 应用与数据库交互时,如何防止会话资源泄漏?
建议使用 try/finally 或 with 语句确保会话关闭,Flask-SQLAlchemy 默认会在请求结束时自动关闭会话,但若使用原生 SQLAlchemy 或手动管理,可借助 teardown_appcontext 装饰器处理:
@app.teardown_appcontext def shutdown_session(exception=None): db.session.remove()
在长期运行的任务中,应显式调用 db.session.close() 并配合会话作用域(如 scoped_session)来管理线程安全。
