flask创建数据库连接池
在Python中,您可以使用 Flask-SQLAlchemy 这个扩展来创建一个数据库连接池。Flask-SQLAlchemy 是一个用于 Flask 框架的 SQLAlchemy 操作封装,实现了 ORM(Object Relational Mapper)。ORM 主要用于将类与数据库中的表建立映射关系,使得我们可以非常方便地通过操作类来操作数据库。
以下是 SQLAlchemy 的一些关键特点:
- ORM(Object-Relational Mapping):SQLAlchemy 提供了一套完整的 ORM 系统,它可以将数据库表映射为 Python 类,将表中的行映射为这些类的实例,将列映射为实例的属性。通过这种映射,你可以使用面向对象的方式操作数据库,而不必编写 SQL 语句。
- 数据库抽象:SQLAlchemy 提供了一套数据库抽象层,它可以适应多种数据库系统,如 MySQL、PostgreSQL、SQLite 等。通过这个抽象层,你可以使用相同的 API 操作不同的数据库系统。
- SQL 表达式语言:除了 ORM,SQLAlchemy 还提供了一套 SQL 表达式语言,你可以用它来编写 SQL 语句。这个表达式语言提供了比原生 SQL 更高级的抽象,可以更方便地编写复杂的 SQL 语句。
- 连接池和事务管理:SQLAlchemy 提供了一套连接池和事务管理机制,你可以用它来管理和复用数据库连接,处理事务。
在许多 Python web 框架(如 Flask、Pyramid 等)中,SQLAlchemy 都是默认或推荐的数据库操作库。它提供了许多强大的功能,使得数据库操作变得非常方便和高效。
以下是一种创建 Flask-SQLAlchemy 连接池的方式:
- 安装 Flask-SQLAlchemy。如果您还没有安装,可以使用以下命令进行安装:
pip install Flask-SQLAlchemy
- 在你的 Flask 应用中设置 SQLAlchemy 的数据库 URI 和连接池的大小:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name'
app.config['SQLALCHEMY_POOL_SIZE'] = 20
db = SQLAlchemy(app)
上述代码中 'mysql://username:password@localhost/db_name'
是你的数据库连接信息,你需要替换为实际的值。SQLALCHEMY_POOL_SIZE
是连接池的大小,你可以根据实际需要设置。
- 使用
db
对象进行数据库操作。例如,定义一个模型:
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 '<User %r>' % self.username
- 您可以使用
db.session
来进行数据库事务,如增删查改等:
user = User(username='test', email='test@example.com')
db.session.add(user)
db.session.commit()
这样就实现了一个 Flask 的 SQLAlchemy 数据库连接池。请注意,如果数据库是 PostgreSQL 或其他类型,需要更改 SQLALCHEMY_DATABASE_URI
中的 'mysql://'
部分。
User模型解释
上述代码中的 User
是一个 SQLAlchemy 的模型,它表示了一个数据库表。在这个例子中,这个表的名称默认是 “user”,并且它有三个字段:id,username 和 email。
class User(db.Model):
这一行定义了User
类,该类继承自db.Model
,所以它具有 SQLAlchemy Model 的所有属性和方法。id = db.Column(db.Integer, primary_key=True)
这一行定义了一个名为 “id” 的列。该列的类型是 Integer,并且它被设置为表的主键。username = db.Column(db.String(80), unique=True, nullable=False)
这一行定义了一个名为 “username” 的列。该列的类型是 String,长度最大为80。unique=True
意味着这个表中的 “username” 必须是唯一的,nullable=False
意味着这个列不能为 NULL。email = db.Column(db.String(120), unique=True, nullable=False)
这一行定义了一个名为 “email” 的列。这个列的类型是 String,长度最大为120。同样地,unique=True
和nullable=False
分别表示这个列必须具有唯一值,并且不能为 NULL。def __repr__(self):
这是一个魔法方法,当你尝试打印一个User
对象时,Python 会调用这个方法。在这个例子中,它将返回一个字符串,如<User 'username'>
。
这个 User
模型可以用来操作数据库中的用户表。例如,你可以使用这个模型来查询用户,添加新的用户,或者删除用户。
下面是一个删除用户的例子:
user = User.query.filter_by(username='test').first() # 查询用户名为 'test' 的用户
if user:
db.session.delete(user) # 如果用户存在,就删除这个用户
db.session.commit() # 提交事务
user = User.query.filter_by(username='test').first()
:这行代码查询数据库中用户名为 ‘test’ 的用户。filter_by()
是一个过滤方法,它返回满足条件的结果。first()
是一个查询方法,它返回查询结果的第一项。如果查询结果为空,那么first()
将返回None
。if user:
:这个判断语句检查查询结果是否为None
。如果user
为None
,说明数据库中没有用户名为 ‘test’ 的用户,因此我们不能删除它。如果user
不是None
,说明我们找到了一个用户名为 ‘test’ 的用户,因此我们可以删除它。db.session.delete(user)
:这行代码删除查询到的用户。delete()
方法接受一个 SQLAlchemy 模型的实例作为参数,并将其标记为待删除。db.session.commit()
:这行代码提交事务,将所有的改动(包括删除操作)保存到数据库。如果你没有调用commit()
,那么delete()
的改动不会被保存到数据库。
请注意,如果你尝试删除一个不存在的对象,SQLAlchemy 会抛出一个异常。所以在删除之前,你应该检查你的对象是否存在。
补充
虽然这个User类代表了数据库中的一个表,但是并不意味着这个表已经在数据库中创建了。在你第一次操作这个表之前,你需要确保这个表已经在数据库中创建。你可以使用 db.create_all()
方法来自动创建所有的表,或者你也可以手动在数据库中创建这个表:
-
使用
db.create_all()
方法。这个方法会自动创建所有定义的但尚未在数据库中存在的表。这个方法通常在 Flask 应用启动时运行一次,例如:from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name' db = SQLAlchemy(app) class User(db.Model): # ... db.create_all()
-
手动在数据库中创建这个表。你可以通过 SQL 语句或者数据库管理工具在数据库中创建这个表。
如果你尝试对一个在数据库中不存在的表进行操作(如查询、添加记录或删除记录),SQLAlchemy 会抛出一个错误。所以在操作表之前,你应该确保这个表已经在数据库中存在。