有哪些做问卷调查给钱的网站,市场调研公司收费标准,投资建设网站,深圳网站建设网站优化服务Flask Web开发基础#xff1a;数据库与ORM实战 该文介绍了如何使用 Flask、SQLAlchemy 和 SQLite 实现数据库操作。首先#xff0c;通过创建虚拟环境和安装 flask-sqlalchemy#xff08;版本2.5.1#xff09;及 sqlalchemy#xff08;版本1.4.47#xff09;来设置环境。接…Flask Web开发基础数据库与ORM实战 该文介绍了如何使用 Flask、SQLAlchemy 和 SQLite 实现数据库操作。首先通过创建虚拟环境和安装 flask-sqlalchemy版本2.5.1及 sqlalchemy版本1.4.47来设置环境。接着配置数据库URI定义User和Movie模型类表示数据库表并通过db.create_all()创建表。文章还展示了如何插入、查询、更新和删除记录强调了db.session.commit()在保存更改中的关键作用。查询涉及filter、order_by等方法提供了一系列示例。 以 sqlite SQLAlchemy 为案例基于 flask 完成对数据库的连接、操作数据库、操作表记录。 使用 SQLAlchemy 操作数据库
SQLAlchemy——一个 Python 数据库工具ORM即对象关系映射。
通过定义模型类python代码的类来表示数据库的表flask 有很多第三方扩展选择 flask-sqlalchemy 扩展集成 SQLAlchemy
安装环境
mkdir 3-flask-db-sqlalchemy
#创建虚拟环境
python -m venv venv
#激活虚拟环境
./venv/Scripts/activate安装依赖
要同时安装 flask-sqlalchemy 和 sqlalchemy
pip install flask2.3.3
pip install flask-sqlalchemy2.5.1 sqlalchemy1.4.47提示 Flask-SQLAlchemy 3.x / SQLAlchemy 2.x 版本有一些大的变化所以这里固定安装 2.5.1 和 1.4.47 版本。 配置数据库并初始化
数据库 URI sqlite 的绝对路径根目录下/data.db
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import sqlalchemy as sa
import os
import sysWIN sys.platform.startswith(win)
if WIN:prefix sqlite:///
else:prefix sqlite: app Flask(__name__)
app.config[SQLALCHEMY_DATABASE_URI] prefix os.path.join(app.root_path , data.db)
app.config[SQLALCHEMY_TRACK_MODIFICATIONS] False # 关闭对模型修改的监控# 在扩展类实例化前加载配置
db SQLAlchemy(app)定义数据库模型
db 是前一步实例化的变量。由于db.Column db.Integer 没有提示改为手动引入 sqlalchemy 。
import sqlalchemy as sa
class User(db.Model):id sa.Column(sa.Integer, primary_keyTrue) # 主键name sa.Column(sa.String(20)) # 名字class Movie(db.Model):id sa.Column(sa.Integer, primary_keyTrue) # 主键title sa.Column(sa.String(60)) # 电影标题year sa.Column(sa.String(4)) # 电影年份模型类要声明继承 db.Model 在 db.Column() 中添加额外的选项参数可以对字段进行设置。比如primary_key 设置当前字段是否为主键。除此之外常用的选项还有 nullable布尔值是否允许为空值、index布尔值是否设置索引、unique布尔值是否允许重复值、default设置默认值等。 每一个类属性字段要实例化 db.Column传入的参数为字段的类型下面的表格列出了常用的字段类。 字段类说明db.Integer整型db.String (size)字符串size 为最大长度例如 db.String(20)db.Text长文本db.DateTime时间日期Python datetime 对象db.Float浮点数db.Boolean布尔值
数据库操作
创建数据库
db.create_all() #如果没有就创建数据库表有的话就不执行更新表结构 注意drop_all()会删除所有数据 #你改动了模型类想重新生成表模式需要先执行删除再创建。
db.drop_all() #注意会删除所有数据
db.create_all()表记录插入
分为三个步骤 创建记录 添加到会话 提交会话
User Movie 为上面建立的模型类
user User(nameGrey Li) # 创建一个 User 记录
m1 Movie(titleLeon, year1994) # 创建一个 Movie 记录
m2 Movie(titleMahjong, year1996) # 再创建一个 Movie 记录
db.session.add(user) # 把新创建的记录添加到数据库会话
db.session.add(m1)
db.session.add(m2)
db.session.commit() # 提交数据库会话只需要在最后调用一次即可提示 在实例化模型类的时候我们并没有传入 id 字段主键因为 SQLAlchemy 会自动处理这个字段。 最后一行 db.session.commit() 很重要只有调用了这一行才会真正把记录提交进数据库前面的 db.session.add() 调用是将改动添加进数据库会话一个临时区域中。
表记录查询
查询语句语法 模型类.query.过滤方法可选.查询方法 过滤方法
过滤方法说明filter()使用指定的规则过滤记录返回新产生的查询对象filter_by()使用指定规则过滤记录以关键字表达式的形式返回新产生的查询对象order_by()根据指定条件对记录进行排序返回新产生的查询对象group_by()根据指定条件对记录进行分组返回新产生的查询对象
查询方法
查询方法说明all()返回包含所有查询记录的列表first()返回查询的第一条记录如果未找到则返回 Noneget(id)传入主键值作为参数返回指定主键值的记录如果未找到则返回 Nonecount()返回查询结果的数量first_or_404()返回查询的第一条记录如果未找到则返回 404 错误响应get_or_404(id)传入主键值作为参数返回指定主键值的记录如果未找到则返回 404 错误响应paginate()返回一个 Pagination 对象可以对记录进行分页处理
User Movie 为上面建立的模型类
movie Movie.query.first() # 获取 Movie 模型的第一个记录返回模型类实例
print(movie.title)
Movie.query.all() # 获取 Movie 模型的所有记录返回包含多个模型类实例的列表
Movie.query.count() # 获取 Movie 模型所有记录的数量
Movie.query.get(1) # 获取主键值为 1 的记录
Movie.query.filter_by(titleMahjong).first() # 获取 title 字段值为 Mahjong 的记录
Movie.query.filter(Movie.titleMahjong).first() # 等同于上面的查询但使用不同的过滤方法提示 我们在说 Movie 模型的时候实际指的是数据库中的 movie 表。表的实际名称是模型类的小写形式自动生成如果你想自己指定表名可以定义 __tablename__ 属性。 对于最基础的 filter() 过滤方法SQLAlchemy 支持丰富的查询操作符具体可以访问文档相关页面查看。除此之外还有更多的查询方法、过滤方法和数据库函数可以使用具体可以访问文档的 Query API 部分查看。
表记录更新
movie Movie.query.get(2)
movie.title WALL-E # 直接对实例属性赋予新的值即可
movie.year 2008
db.session.commit() # 注意仍然需要调用这一行来提交改动表记录删除
movie Movie.query.get(1)
db.session.delete(movie) # 使用 db.session.delete() 方法删除记录传入模型实例
db.session.commit() # 提交改动