Python Web之路:Flask7-数据库

点击名片关注 阿尘blog,一起学习,一起成长

本文主要分享通过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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!