赞
踩
使用场景:刚开始接触flask框架时,每次访问数据库都创建一个新的数据库连接。而在Flask应用中,通常更好的做法是使用应用上下文(application context)来管理数据库连接,例如使用Flask-SQLAlchemy这样的扩展来自动管理连接的生命周期。即:数据库连接重用
Flask-SQLAlchemy 是一个 Flask 扩展,它为 Flask 应用提供了对 SQLAlchemy 的集成支持,使得在 Flask 应用中操作数据库变得非常简单。SQLAlchemy 是一个强大的 Python ORM(对象关系映射)框架,它允许开发者使用 Python 类和对象来操作数据库,而无需编写繁琐的 SQL 语句。
具体使用方法如下
使用 pip 安装Flask-SQLAlchemy:
pip install Flask-SQLAlchemy
在Flask 应用中,需要配置 Flask-SQLAlchemy 以连接到数据库。
- from flask import Flask
- from flask_sqlalchemy import SQLAlchemy
-
- app = Flask(__name__)
- app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:tmp/test.db' # 使用 SQLite 数据库,你可以替换为其他数据库 URI
- app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 关闭对模型修改的追踪以提高性能
-
- db = SQLAlchemy(app)
使用 Flask-SQLAlchemy,你可以定义 Python 类来表示数据库中的表。每个类都继承自 db.Model
,并且使用 SQLAlchemy 提供的字段类型来定义表的列。
- class User(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- username = db.Column(db.String(80), unique=True, nullable=False)
- email = db.Column(db.String(120), unique=True, nullable=False)
-
- def __repr__(self):
- return f'<User {self.username}>'
在这个例子中,定义了一个 User
模型,它有三个字段:id
(主键),username
(唯一且不可为空),和 email
(唯一且不可为空)。
在 Flask 应用启动时,可以使用 db.create_all()
方法来创建所有定义的模型对应的数据库表。
- if __name__ == '__main__':
- with app.app_context():
- db.create_all()
- app.run(debug=True)
使用 with app.app_context():
来确保在没有请求的情况下也能正确创建数据库表。
Flask-SQLAlchemy 提供了丰富的 API 来查询、添加、更新和删除数据库中的数据。
可以使用模型的 query
属性来执行查询操作。
- users = User.query.all() # 获取所有用户
- user = User.query.get(1) # 根据 ID 获取单个用户
- user = User.query.filter_by(username='admin').first() # 根据条件获取单个用户
可以创建模型类的实例,并使用 db.session.add()
方法将其添加到会话中,然后调用 db.session.commit()
方法来提交事务,将数据保存到数据库中。
- new_user = User(username='newuser', email='newuser@example.com')
- db.session.add(new_user)
- db.session.commit()
可以修改模型实例的属性,然后调用 db.session.commit()
来提交更改。
- user = User.query.get(1)
- user.username = 'updated_username'
- db.session.commit()
可以使用 db.session.delete()
方法来删除一个模型实例。
- user = User.query.get(1)
- db.session.delete(user)
- db.session.commit()
Flask-SQLAlchemy 支持定义模型之间的关系,如一对一、一对多、多对多等,通过定义外键和关系属性来实现。
- class Post(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- title = db.Column(db.String(100), nullable=False)
- author_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
- author = db.relationship("User", back_populates="posts")
-
- class User(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- username = db.Column(db.String(80
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。