Python(Web时代)—— Flask的数据库操作

这篇具有很好参考价值的文章主要介绍了Python(Web时代)—— Flask的数据库操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

SQLAlchamy 

是 Python 中一个通过 ORM 操作数据库的框架

SQLAlchemy(对象关系映射器)提供了一种方法,用于将用户定义的Python类与数据库表相关联,并将这些类(对象)的实例与其对应表中的行相关联。

简单理解: 创建一个类,一个类对应了一个数据库中的一张表,类的属性名对应了表中的字段名,这个类称为映射类

SQLAlchemy本身无法操作数据库,其必须使用 pymsql 等第三方插件,从而实现对数据库的操作,如:mysql数据库

mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

使用

flask_sqlalchamy

Flask 中最方便用的数据库框架是 flask_sqlalchamy,是对 SQLAlchamy 在 Flask 中的扩展,它主要在于简化Flask 中 sqlalchamy的使用

安装

pip install flask_sqlalchemy

初始化

为了方便管理数据库相关的配置项,flask_sqlalchamy 中采用app.config进行相关属性配置

配置变量的名称必须使用大写,写入配置的语句一般会放到扩展类实例化语句之前

配置项 说明
SQLALCHEMY_DATABASE_URI 数据库的链接地址
SQLALCHEMY_BINDS 访问多个数据库时,用于设置数据库链接池地址
SQLALCHEMY_ECHO 是否打印底层执行的SQL语句
SQLALCHEMY_RECORD_QUERIES 是否记录执行的查询语句,用于慢查询分析
SQLALCHEMY_TRACK_MODIFICATIONS 是否追踪数据库变化
SQLALCHEMY_ENGINE_OPTIONS 设置针对 sqlalchemy本体的配置项

设置数据库链接

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 设置数据库链接地址
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@127.0.0.1:3306/test'
# 设置显示底层执行的sql语句
app.config['SQLALCHEMY_ECHO'] = True

# 初始化组件对象,关联flask应用
db = SQLAlchemy(app)

构建模型

模型简单来说就是数据库中的一张表定义,需要有名称,字段,在 Python 中用一个类来表示,由于需要和数据库的表对应,模型必须继承自 SQLAlchamy 的 Model 类

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import datetime

app = Flask(__name__)

# 设置数据库链接地址
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@127.0.0.1:3306/test'
# 设置显示底层执行的sql语句
app.config['SQLALCHEMY_ECHO'] = True

# 初始化组件对象,关联flask应用
db = SQLAlchemy(app)


# 构建模型类
class User(db.Model):
    # 设置表名,表名默认为类名小写
    __tablename__ = 'user'
    id = db.Column(db.Integer,primary_key=True)   # 设置主键,默认自增
    name = db.Column(db.String(20))
    age = db.Column(db.Integer,default=20)  #设置默认值
    createtime=db.Column(db.DateTime())

    def __repr__(self):  # 自定义 交互模式 & print() 的对象打印
      return "(%s, %s, %s, %s)" % (self.id, self.name, self.age,self.createtime)

if __name__ == '__main__':
    app.run(debug=True)

__repr__ 方法定义了一个对象的比较易读的显式方式

常用字段类

字段类型 说明
db.Integer 整数
db.String(size) 字符串 size 为字符串长度
db.DateTime 日期时间
db.Date 日期
db.Text 长文本,可以存放 CLOB (二进制数据)
db.Float 浮点数字
db.Boolean 布尔值

常用字段选项

字段类型 说明
primary_key 设置表的主键,默认自增
unique 设置唯一索引
nullable 非空约束
default 设置默认值
index 创建索引

创建库表

@app.route("/initDB")
def init_db():
    # 删除所有继承睡在db.Model的表
    db.drop_all()
    # 创建所有继承自 db.Model的表
    db.create_all()
    return "initdb"

注:db.drop_all() 和 db.create_all() 放在 main中不启作用,所以单独写一个方法进行初始化。

一般库表的创建与应用都是分开的,单独创建库表,没必要将此类语句写在应用中

数据操作

增加数据

@app.route("/add")
def add():
    # 添加数据
    user1 = User(name='zhao', age=33, createtime=datetime.datetime.now())
    # 将模型添加到会话中
    db.session.add(user1)
    # 添加多条记录
    # db.session.add_all([user1,user2,user3])

    # 提交会话, sqlalchemy会自动创建隐式事务,失败会自动回滚
    db.session.commit()
    return "add" 
    

注:

  • sqlalchemy会自动创建事务,并将数据的操作都包含在一个事务中,提交会话就会提交事务

  • session 是一个与数据库通信的会话,是 SQLAlchamy 框架与数据库交互的代理

  • 可以调用 session.rollback() 回滚掉未提交的变化

查询数据

简单查询

@app.route("/query")
def query():
    # 查询所有用户数据, 返回User列表,
    data = User.query.all()
    for item in data:
        print(item.name,item.age)

    # 查询有多少个用户,返回结果数
    data = User.query.count()
    print(data)

    # 查询第1个用户 , 返回User对象
    data = User.query.first()
    print(data)

    # 查询id为4的用户, 返回User对象
    data = User.query.get(4)
    print(data)
    return "query"
    

条件过滤查询

@app.route("/query2")
def query2():
    # 查询 name 等于 zhao 的记录集中第一条记录
    data = User.query.filter(User.name =='zhao').first()
    # 查询 name 不等于 zhao 的所有记录
    data = User.query.filter(User.name != 'zhao').all()

    # 前模糊查询
    data = User.query.filter(User.name.like("%zhao")).all()
    print(data)

    # 查询名字以 zhao 开头的用户
    data = User.query.filter(User.name.startswith('zhao')).all()

    # 查询名字是 zhao,并且年龄是22岁的用户
    from sqlalchemy import and_
    data = User.query.filter(and_(User.name=='zhao', User.age==22)).all()

    # 查询名字是 zhao或者hong的用户
    from sqlalchemy import or_
    data = User.query.filter(or_(User.name=='zhao', User.name=='hong')).all()

    # 查询id为[1, 2, 3]的用户
    data = User.query.filter(User.id.in_([1, 2, 3])).all()


    # 分页查询
    # 所有用户先按年龄从小到大, 再按id从大到小排序, 取前5个
    data = User.query.order_by(User.age, User.id.desc()).limit(5).all()

    # 分页查询, 每页1个, 查询第2页的数据  paginate(页码, 每页条数)
    pn = User.query.paginate(page=2, per_page=1)
    print("总页数:"+str(pn.pages)+" 当前页码:"+str(pn.page)+"当前页的数据:"+ str(pn.items)+" 总条数:"+str(pn.total))


    # 分组查询
    # 查询每个年龄的人数    select age, count(name) from t_user group by age  分组聚合
    from sqlalchemy import func
    data = db.session.query(User.age, func.count(User.id).label("count")).group_by(User.age).all()

    return "query2"

常用查询方法

方法名称 说明
all() 返回所有查询记录的列表
first() 返回查询的第一条记录,如果未找到,则返回None
get(id) 传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回None
count() 返回查询结果的数量
paginate() 返回一个Pagination对象,可以对记录进行分页处理

更新数据

@app.route("/update")
def update():
    # 更新用户年龄为44,条件是:用户名=zhao
    # 相当于:update user set age = 44 where name = 'zhao';
    User.query.filter(User.name == 'zhao').update({'age': 44})
    # 提交会话
    db.session.commit()
    return "update"

删除数据

@app.route("/del")
def delete():
    # 删除id=1的用户
    # 相当于:delete from user where id=1
    User.query.filter(User.id == 1).delete()
    # 提交会话
    db.session.commit()
    return "del"

多表关联查询

连接查询

  • 开发中有 联表查询需求 时, 一般会使用 join连接查询

db.session.query(主表模型字段1, 主表模型字段2, 从表模型字段1, xx.. ).join(从表模型类, 主表模型类.主键 == 从表模型类.外键)

示例

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import datetime

app = Flask(__name__)

# 设置数据库链接地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@127.0.0.1:3306/test'
# 设置显示底层执行的sql语句
app.config['SQLALCHEMY_ECHO'] = True

# 初始化组件对象,关联flask应用
db = SQLAlchemy(app)


# 构建模型类
class User(db.Model):
    # 设置表名,表名默认为类名小写
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)  # 设置主键,默认自增
    name = db.Column(db.String(20))
    age = db.Column(db.Integer, default=20)  # 设置默认值
    createtime = db.Column(db.DateTime())

    def __repr__(self):  # 自定义 交互模式 & print() 的对象打印
        return "(%s, %s, %s, %s)" % (self.id, self.name, self.age, self.createtime)


class Address(db.Model):
    __tablename__ = 'address'
    id = db.Column(db.Integer, primary_key=True)
    detail = db.Column(db.String(20))
    user_id = db.Column(db.Integer)  # 定义外键


if __name__ == '__main__':
    app.run(debug=True)


@app.route("/")
def index():
    return "index"


@app.route("/query")
def query():
    """ 查询多表数据  需求: 查询姓名为"hong" 的用户id和地址信息"""
    # sqlalchemy的join查询
    # 相当于:SELECT user.id AS user_id, address.detail AS address_detail
    #           FROM user INNER JOIN address ON user.id = address.user_id
    data = db.session.query(User.id, Address.detail).join(Address, User.id == Address.user_id).filter(
        User.name == 'hong').all()
    for item in data:
        print(item.detail, item.id)

    return "query"

程序猿与投资生活实录已改名为  程序猿知秋,WX 公众号同款,欢迎关注!! 

 文章来源地址https://www.toymoban.com/news/detail-813655.html

到了这里,关于Python(Web时代)—— Flask的数据库操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flask数据库操作

    本文将详细介绍在Flask Web应用中如何设计数据库模型,并使用Flask-SQLAlchemy等扩展进行数据库操作的最佳实践。内容涵盖数据模型设计,ORM使用,关系映射,查询方法,事务处理等方面。通过本文,您可以掌握Flask数据库应用的基本知识。 Flask作为一个流行的Python Web框架,提供了高度的

    2024年02月14日
    浏览(38)
  • flask中的操作数据库的插件Flask-SQLAlchemy

    Web 开发中,一个重要的组成部分便是数据库了。Web 程序中最常用的莫过于关系型数据库了,也称 SQL 数据库。另外,文档数据库(如 mongodb)、键值对数据库(如 redis)近几年也逐渐在 web 开发中流行起来,我们习惯把这两种数据库称为 NoSQL 数据库。 大多数的关系型数据库引

    2024年02月09日
    浏览(56)
  • 如何使用Flask-SQLAlchemy来管理数据库连接和操作数据?

    首先,我们需要安装Flask-SQLAlchemy。你可以使用pip来安装它,就像这样: 好了,现在我们已经有了一个可以操作数据库的工具,接下来让我们来看看如何使用它吧! 首先,我们需要创建一个Flask应用对象,并配置数据库的连接字符串和师: 现在,我们已经创建了一个数据库,

    2024年02月15日
    浏览(46)
  • python使用flask实现前后端分离&通过前端修改数据库数据【全栈开发基础】

    完整代码放到了最后,时间紧张的话直接拉到最后或点击目录【🥩 完整代码】看完整代码 这里先提一下,我们运行后端代码之前需要先建立一个名字为 python 的数据库,而后在该数据库下创建表 userinfo ,因为看到有的朋友后端代码拿过去后会运行不起来或者就是直接报错了

    2023年04月09日
    浏览(40)
  • 将网页数据读入数据库+将数据库数据读出到网页——基于python flask实现网页与数据库的交互连接【全网最全】

    【全网最全!保姆级教学!!】 本篇博客基于flask技术,实现数据库和网页端的交互。 实现效果:在网页端输入数据,能够将数据存入数据库。反向操作时,能将数据库的数据取出,显示在网页端。不仅如此,还支持数据的查询和修改。  读取网页数据存入数据库,效果如下

    2024年02月13日
    浏览(40)
  • python:使用Flask-SQLAlchemy对数据库增删改查的简单示例

    以下将介绍Flask-SQLAlchemy对数据库增删改查的简单示例。 一、安装所需的库 pip install flask flask-sqlalchemy flask-mysql 二、创建数据表 本示例使用mysql创建数据库和表 CREATE TABLE `user` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(255) DEFAULT NULL,   `age` int(11) DEFAULT NULL,   PRIMARY KEY (`id

    2024年02月07日
    浏览(65)
  • 基于python淘宝商品数据爬虫分析可视化系统 网络爬虫+Flask框架+MySQL数据库 大数据 毕业设计

    python语言、Flask框架、淘宝商品数据、selenium网络爬虫、MySQL数据库、数据分析、Echarts可视化大数据毕业设计、爬取 Selenium网络爬虫淘宝商品数据可视化系统是一个基于Python和Selenium的Web爬虫应用程序,可以实现对淘宝上特定商品的价格、销量、评价等数据进行自动化抓

    2024年02月16日
    浏览(50)
  • 【Flask 连接数据库,使用Flask-Migrate实现数据库迁移及问题汇总】

    Flask 连接数据库,使用Flask-Migrate实现数据库迁移 安装Flask-Migrate插件 使用Flask-Migrate步骤 app.py主要用于数据库连接 model.py 中导入了 db,作用是存储一个User类 ,用于生成表头。 manager.py用于数据迁移管理,运行后将生成一个文件夹。 Flask-Migrate运行 问题汇总 问题一:flask_mig

    2024年01月16日
    浏览(46)
  • 毕业设计:python人脸识别考勤系统 签到系统 深度学习 Flask框架 Dlib库 MySQL数据库 大数据(源码+论文)✅

    🍅 大家好,今天给大家分享一个Python项目,感兴趣的可以先收藏起来,点赞、关注不迷路! 🍅 大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。 技术栈: Python语言、MySQL数据库、Flask框架、Echarts可视化、Dlib库、刷脸签到、多

    2024年03月22日
    浏览(71)
  • flask笔记 02 | Flask数据库连接(sqlite、mysql)

    Flask没有指定使用的数据库,不像django提供了orm数据库抽象层,可以直接采用对象的方式操作数据库。但为了开发效率,在开发Flask项目中一般会选择 SQLALchemy 来操作数据库,类似django的ORM. SQLALchemy实际是对数据库的抽象,让开发者不直接使用sql语句进行开发,而是通过Pytho

    2024年01月25日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包