本文主要分享通过flask连接操作数据库相关知识
数据库有关系型数据库的非关系型数据库,其各自特点本文则不再叙说,但是对于Flask搭建中小型应用来说,SQL数据库和NoSQL数据库都差不多,性能相当。本文将分享如何在flask连接和操作数据库
1 使用Flask-SQL Alchemy管理数据库
在讲Flask-SQLAlchemy还是简单说说关于如何选择Python数据库框架的问题,大多数数据库引擎都有Python包,而Flask并不限制你用什么类型的数据库包,比如pymysql、pymongo。并且还有一些数据库抽象层代码包可供选择,比如SQLAlchemy和MongoEngine,这些包可以处理高级的Python对象,而不用处理如表、文档或查询语句之类的数据库问题。
选择数据库框架一般要考虑多个因素,比如:
1、易用性:数据库引擎明显不如数据库抽象层便利,抽象层利用对象关系映射(ORM)或对象文档映射器(ODM)将高层的面向对象操作转换成底层的数据库指令;
2、性能(ORM或ODM转换数据库业务的消耗)
3、可移植性(考虑到开发平台和生产平台的移植),有些框架只是针对一种数据库引擎提供了抽象层,但是有些可以支持不同数据库引擎,比如SQLAlchemy可以支持MySQL、postgres、sqlite等等;
4、Flask集成度,选择框架我们不一定选择集成的,但是集成了flask的可以更方便节约时间而Flask-SQLAlchemy 是一个 Flask 的扩展,它简化了在 Flask 应用程序中使用 SQLAlchemy 的过程。
好了话不多说,开启正文:
安装Flask-SQLAlchemy
pip install flask-sqlalchemy
在Flask-SQLAlchemy中数据库使用URL指定,并且保存到SQLALCHEMY_DATABASE_URI键中,最好还要把SQLALCHEMY_TRACK_MODIFICATIONS设为False
Flask-SQLAlchemy数据库URL
数据库引擎 | URL |
---|---|
MySQL | mysql://username:password@hostname/database |
Postgres | postgresql://username:password@hostname/database |
SQLite(linux,macOS) | sqlite://absolute/path/to/database |
SQLite(Windows) | sqlite://c:/absolute/path/to/database |
注意
如果使⽤的是mysqldb驱动,协议名: mysql 如果使⽤的是pymysql驱动,协议名: mysql+pymysql(一般我们使用的pymysql)
import os
from flask_sqlalchemy import SQLAlchemy
# 配置可以直接在配置文件中设置
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://{username}:{password}@{ip_address}:{port}/{database}"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。
db = SQLAlchemy(app)
# 创建一个数据库对象
定义模型
在ORM中模型一般是python的类,类的属性对应数据库表的列:mode.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class User(db.Model):
__tablename__="user"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
address = db.relationship('Address', backref='user',uselist=False)
def __repr__(self):
return '<User %r>' % self.username
class Address(db.Model):
__tablename__="address"
id = db.Column(db.Integer, primary_key=True)
street = db.Column(db.String(50))
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
__tablename__类变量用于定义数据库中使用的表名,没有定义会使用一个默认的名称,其余变量都是数据库的列,定义为db.Column类的示例,__repr_函数用于打印对象时显示对象的属性值,供调试和测试使用
下面列出最常用的SQLAlchemy列类型
类型名 | Python类型 | 说明 |
---|---|---|
Integer | int | 普通整数,通常是32位 |
SmallInteger | int | 取值范围小的整数,通常是16位 |
BigInteger | int or long | 不限制精度的整数 |
Float | float | 浮点数 |
Numeric | decimal.Decimal | 定点数 |
String | str | 变长字符串 |
Text | str | 变长字符串,对较长或不限长度的字符串做了优化 |
Unicode | unicode | 变长Unicode字符串 |
UnicodeText | unicode | 变长Unicode字符串,对较长或不限长度的字符串做了优化 |
Boolean | bool | 布尔值 |
Date | datetime.date | 日期 |
Time | datetime.time | 时间 |
DateTime | datetime.datetime | 时间和日期 |
Interval | datetime.timedelta | 时间间隔 |
Enum | str | 一组字符串 |
PickleType | 任何Python对象 | 自动使用Pickle序列化 |
LargeBinary | str | 二进制blob |
其余参数指定属性的配置选项
选项明 | 说明 |
---|---|
primary_key | 设置为True,这一列就是主键 |
unique | 设置为True,这一列值唯一 |
index | 设置为True,为列创建索引 |
nullable | 设置为True,允许出现控制,False就不允许 |
default | 设置默认值 |
数据库表关系声明
一般使用relationship函数来声明两张表之间的关系,其中通过传入参数来建立具体联系,比如上述示例代码
用db.ForeignKey来定义表中的外键,通过外键与其他表建立关系
另外 address = db.relationship('Address', backref='user',uselist=False)
这段代码里面
-
relationship
函数来声明User
和Address
之间的关系。 -
backref
参数表示在 Address 模型中添加一个名为user
的属性,该属性引用 User 模型。 -
uselist
参数设置为False
,表示User
和Address
之间的关系是一对一的关系
下面列出SQLAlchemy常用的关系选项
选项名 | 说明 |
---|---|
backref | 在关系的另一个模型中添加反向引用 |
primaryjoin | 明确指定两个模型之间使用的联结条件:只有在模棱两可的关系中需要指定 |
lazy | 指定如何加载相关记录,可选值有select(首次访问时按需加载)、immediatce(源对象加载后就加载)、joined(加载记录,但使用联结)、subquery(立即加载,但使用子查询),noload(永不加载)和dynamic(不加载记录,但提供加载记录的查询) |
uselist | 如果设为False,不使用列表,而使用标量值 |
order_by | 指定关系中记录的排序方式 |
secondary | 指定多对多关系中关联表的名称 |
secondaryjoin | SQLAlchemy无法自行决定时,指定多对多关系中的二级联结条件 |
2 数据库操作
1、创建表
with app.app_contt():
# 初始化数据库
db.init_app(app)
#db.drop_all() #删除所有的表
db.create_all() #创建所有的表
# 这个函数将寻找所有db.Model的子类,然后在数据库中创建表,如果已经有了就会更新表
2、插入和修改行
传入行一般先添加到会话中,然后在提交
#增加,修改使用add也可实现
@app.route("/users/create", methods=["GET", "POST"])
def user_create():
if request.method == "POST":
user = User(
username=request.form["username"],
email=request.form["email"],
)
db.session.add(user)
db.session.commit()
return redirect(url_for("user_detail", id=user.id))
return render_template("user/create.html")
3、删除行
#删除
@app.route("/user/<int:id>/delete", methods=["GET", "POST"])
def user_delete(id):
user = db.get_or_404(User, id)
if request.method == "POST":
db.session.delete(user)
db.session.commit()
return redirect(url_for("user_list"))
return render_template("user/delete.html", user=user)
4、查询行
# 查询行
@app.route("/user/<int:id>/query", methods=["GET", "POST"])
def user_delete(id):
user = User.query.filter_by(id=id).first()
db.session.commit()
return redirect(url_for("user_list"))
5、常用的SQLAlchemy查询过滤器
过滤器 | 说明 |
---|---|
filter() | 把过滤器添加到原查询上,返回一个新查询 |
filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |
limit() | 使用指定的值限制原查询返回的结果数量,返回一个新查询 |
offset() | 偏移原查询返回的结果,返回一个新查询 |
order_by() | 根据指定条件对原查询结果进行排序,返回一个新查询 |
group_by() | 根据指定条件对原查询结果进行分组,返回一个新查询 |
6、常用的SQLAlchemy查询执行方法
方法 | 说明 |
---|---|
all() | 以列表形式返回查询的所有结果 |
first() | 返回查询的第一个结果,如果没有结果,则返回None |
first_or_404() | 返回查询的第一个结果,如果没有结果,则终止请求,返回404错误响应 |
get() | 返回指定主键对应的行,如果没有对应的行,则返回None |
get_or_404() | 返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回404错误响应 |
count() | 返回查询结果的数量 |
paginate() | 返回一个Paginate对象,包含指定范围内的结果 |
3 创建迁移仓库
1、使用 Flask-Migrate 实现数据库迁移
在开发过程中,随着需求的变化,有可能需要添加或修改表的一些字段,但是原表中的数据不能删除,此时就需要创建新表,并将旧表中的数据迁移至新表中,Flask-Migrate这个扩展就可以在不破坏数据的情况下更新数据库表的结构,并完成数据从旧表到新表的迁移。
2、Flask-Migrate的使用
安装
pip install flask-migrte,pymysql
配置
settings.py
class Config:
DEBUG = True
# 数据库连接配置
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@localhost:3306/test'
SQLALCHEMY_TRACK_MODIFICATIONS = False
ENV='development' #开发环境配置
初始化
app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from settings import Config
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
app = Flask(__name__)
app.config.from_object(Config)
manager = Manager(app)
db = SQLAlchemy(app)
Migrate(app, db)
manager.add_command('mysql', MigrateCommand)
if __name__ == '__main__':
manager.run()
3、迁移过程
首先对模型做必要的更改
在控制台输入以下命令,开始迁移,创建一个迁移目录migrations用于存放迁移脚本
app.py db init
使用以下命令来生成一个新的迁移脚本
app.py db migrate -m 'description(迁移描述)'
应用迁移脚本,数据库更新
app.py db upgrade
撤销最近的一个迁移
app.py db downgrade
其余常用命令
-
app.py db history
:查看数据库迁移历史记录。 -
app.py db current
:查看当前数据库版本。 -
app.py db show
:显示当前数据库的详细信息
至于通过flask-mongoengine操作mongodb数据库大家可以参考[官方文档](Flask-MongoEngine documentation — Flask-MongoEngine 1.0.1.dev289+gd452613 documentation)
时间因素,本次分享到此结束,欢迎大家一起交流
扫描二维码关注阿尘blog,一起交流学习
原文始发于微信公众号(阿尘blog):Python Web之路:Flask7-数据库
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/188298.html