Flask-SQLAlchemy学习总结

本文总结了使用 Flask-SQLAlchemy 进行 Web 开发的关键知识点,包括配置清单、模型声明、基本的 CRUD 操作,如何绑定多个数据库,以及数据迁移的流程。对于 CRUD,特别强调了向数据库插入数据的三个步骤:创建 Python 对象、添加到会话并提交会话。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 配置清单

配置键说明
SQLALCHEMY_DATABASE_URI

用于连接数据的数据库。例如:

  • sqlite:////tmp/test.db
  • mysql://username:password@server/db
SQLALCHEMY_BINDS一个映射绑定 (bind) 键到 SQLAlchemy 连接 URIs 的字典。用于绑定多个数据库
SQLALCHEMY_ECHO如果设置成 True,SQLAlchemy 将会记录所有 发到标准输出(stderr)的语句,这对调试很有帮助。
SQLALCHEMY_RECORD_QUERIES可以用于显式地禁用或者启用查询记录。查询记录 在调试或者测试模式下自动启用。更多信息请参阅 get_debug_queries()
SQLALCHEMY_NATIVE_UNICODE可以用于显式地禁用支持原生的 unicode。这是 某些数据库适配器必须的(像在 Ubuntu 某些版本上的 PostgreSQL),当使用不合适的指定无编码的数据库 默认值时。
SQLALCHEMY_POOL_SIZE数据库连接池的大小。默认是数据库引擎的默认值 (通常是 5)。
SQLALCHEMY_POOL_TIMEOUT指定数据库连接池的超时时间。默认是 10。
SQLALCHEMY_POOL_RECYCLE自动回收连接的秒数。这对 MySQL 是必须的,默认 情况下 MySQL 会自动移除闲置 8 小时或者以上的连接。 需要注意地是如果使用 MySQL 的话, Flask-SQLAlchemy 会自动地设置这个值为 2 小时。
SQLALCHEMY_MAX_OVERFLOW控制在连接池达到最大值后可以创建的连接数。当这些额外的 连接回收到连接池后将会被断开和抛弃。
SQLALCHEMY_TRACK_MODIFICATIONS如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。
Flask项目中,一般使用单独的文件存储配置(如:config.py),应用程序可以使用from_object()来获取配置信息

2. 声明模型

db = SQLAlchemy()
class User(db.Model):
    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username
列类型说明
Integer一个整数
String (size)有长度限制的字符串
Text一些较长的 unicode 文本
DateTime表示为 Python datetime 对象的 时间和日期
Float存储浮点值
Boolean存储布尔值
PickleType存储为一个持久化的 Python 对象
LargeBinary存储一个任意大的二进制数据
选项名说明
primary_key如果设为True,表示主键
unique如果设为True,这列不重复
index如果设为True,创建索引,提升查询效率
nullable如果设为True,允许空值
default为这列定义默认值,可以接受lambda表达式

3. CRUD

a. 插入记录

向数据库插入数据分为三个步骤:

  1. 创建 Python 对象
  2. 把它添加到会话
  3. 提交会话
>>> from yourapp import User
>>> me = User('admin', 'admin@example.com')
>>> db.session.add(me)
>>> db.session.commit()
b. 删除记录
>>> db.session.delete(me)
>>> db.session.commit()
c. 查询记录
Flask-SQLAlchemy 在您的 Model 类上提供了 query 属性。当您访问它时,您会得到一个新的所有记录的查询对象。
>>> peter = User.query.filter_by(username='peter').first()
>>> peter.id
1
>>> peter.email
u'peter@example.org'
SQLAlchemy有查询过滤器如下:
过滤器说明
filter()把过滤器添加到原查询,返回新查询
filter_by()把等值过滤器添加到原查询,返回新查询
limit()使用指定值限制原查询返回的结果数量,返回新查询
offset()偏移原查询返回的结果,返回新查询
order_by()排序返回结果,返回新查询
groupby()原查询分组,返回新查询
这些过滤器返回的结果都是一个新查询,这些查询其实是生成的SQL语句,惰性求值方式也体现在查询上,而这些语句不能生成需要查询的对象,需要调用其他的方法生成对象。
SQL查询执行函数:
方法说明
all()以列表形式返回结果
first()返回第一个结果,如果没有返回None
first_or_404()返回第一个结果,如果没有抛出404异常
get()返回主键对应记录,没有则返回None
get_or_404()返回主键对应记录,如果没有抛出404异常
count()返回查询结果数量
paginate()返回paginate对象,此对象用于分页

4.绑定多个数据库

下面的配置声明了三个数据库连接。特殊的默认值和另外两个分别名为 users`(用于用户)和 `appmeta 连接到一个提供只读访问应用内部数据的 sqlite 数据库):
SQLALCHEMY_DATABASE_URI = 'postgres://localhost/main'
SQLALCHEMY_BINDS = {
    'users':        'mysqldb://localhost/users',
    'appmeta':      'sqlite:////path/to/appmeta.db'
}
create_all() 和 drop_all() 方法默认作用于所有声明的绑定(bind),包括默认的。这个行为可以通过提供 bind 参数来定制。
>>> db.create_all()
>>> db.create_all(bind=['users'])
>>> db.create_all(bind='appmeta')
>>> db.drop_all(bind=None)
当您声明模型时,您可以用 __bind_key__ 属性指定绑定(bind):
class User(db.Model):
    __bind_key__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
如果您在模型上指定了 __bind_key__ ,您可以用它们准确地做您想要的。模型会自行连 接到指定的数据库连接。

5. 数据迁移

创建管理文件manage.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand

db = SQLAlchemy()
app = Flask(__name__)
app.config.from_object(config[config_name])
db.init_app(app)
migrate = Migrate(app, db)
manager = Manager(app)
manager.add_command('db', MigrateCommand)
manager.run()
manager使用说明:
命令格式:python manager.py db [command]
command说明:
init-初始化数据库迁移(自动生成migrations目录及文件),仅在第一次使用
migrate-生成迁移数据,自动根据model变化生成迁移数据文件,含版本控制
upgrade-执行升级操作,将变动的表结构提交到数据库,保留数据库原数据
downgrade-执行降级操作, 相当于撤回本次升级操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值