Flask学习之旅--还是数据库(sqlacodegen + SQL Alchemy)
一、写在前面
其实之前已经写过一篇关于 Flask 中使用数据库的博客了,不过那一篇博客主要是记录我在使用 Flask + MySQL8.0 时所遇到的一些问题(如果用的不是 MySQL8.0估计就没有这么多问题了!)。然后这一篇可以算作一份学习笔记了,也是关于在 Flask 中进行数据库操作的,感觉写这种学习笔记还是比较有用的,可以再学习一遍也就能更好的掌握了。
在使用 Flask 的时候,一般都会创建一个 model.py,然后在里面继承和创建模型,再迁移到数据库中,最后进行一些增删改查等操作。但是如果数据库表已经建立好了呢?有没有办法将这些数据库表引入到 Flask 中呢?
二、sqlacodegen
1.sqlacodegen简介
sqlacodegen pypi:https://pypi.org/project/sqlacodegen/。
其中对 sqlacodegen 的介绍是:这是一个工具,它读取现有数据库的结构并生成相应的 SQLAlchemy 模型代码,如果可能,使用声明式样式。
sqlacodegen 的几个主要特性为:
1)支持 SQLAlchemy 0.8.x - 1.3.x。
2)生成几乎看起来像是手写的声明性代码。
3)生成符合 PEP 8 标准的代码。
4)准确地确定关系,包括多对多,一对一。
5)自动检测连接表继承。
2.sqlacodegen安装
使用 pip 安装即可:
pip install sqlacodegen
3.sqlacodegen用法
下面是一个 sqlacodegen 用法示例:
sqlacodegen mysql+pymysql://root:qwer1234@127.0.0.1/mydb --tables users,roles,phone >models.py
首先是一个 sqlacodegen 命令,后面接上连接数据库的语句,然后可以使用 --tables 指定要导入的数据表,最后用 >models.py 输出到 models.py 中,如果不指定输出文件,会将 python 代码直接打印出来。下面是生成的 models.py 中的代码:
# coding: utf-8
from sqlalchemy import Column, ForeignKey, String
from sqlalchemy.dialects.mysql import INTEGER
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base Base = declarative_base()
metadata = Base.metadata class Phone(Base):
__tablename__ = 'phone' phone = Column(String(11), primary_key=True)
phone_address = Column(String(40)) class Role(Base):
__tablename__ = 'roles' role_id = Column(INTEGER(11), primary_key=True)
role_name = Column(String(45)) class User(Base):
__tablename__ = 'users' user = Column(String(10), primary_key=True)
sex = Column(String(10))
email = Column(String(45))
phone = Column(String(11))
role_id = Column(ForeignKey('roles.role_id'), index=True) role = relationship('Role')
三、SQL Alchemy
1.SQL Alchemy简介
SQL Alchemy pypi:https://pypi.org/project/SQLAlchemy/。
SQL Alchemy 是 Python SQL 工具包和对象关系映射器,它为应用程序开发人员提供了SQL的全部功能和灵活性。
在写上篇博客的时候简单介绍过 Flask-SQLAlchemy,当时说到它将对 SQL Alchemy 的支持添加到 Flask 应用程序中,因此我们通过简单设置之后就能在 Flask 中队数据库进行操作了,可那是当我们在把定义好的模型映射到数据库中时所用的。如果数据库表已经建好了,还怎么用 Flask-SQLAlchemy 来操作呢?这时候就需要使用 SQL Alchemy 了!
2.SQL Alchemy安装
使用 pip 安装即可:
pip install SQLAlchemy
3.SQL Alchemy架构

1)Schema / Types 定义了类到表之间的映射框架(规则)。
2)SQL Expression Language 封装好的 SQL 语句。
3)Engine 操作者。
4)Connection Pooling 连接池。
5)Dialect 根据用户的配置,调用不同的数据库 API(如:Mysql) 并执行对应的 SQL 语句。
4.SQL Alchemy用法
(1)连接数据库
from sqlalchemy import create_engine
engine = create_engine("mysql+pymysql://root:qwer1234@127.0.0.1:3306/mydb")
create_engine() 会返回一个引擎实例,它代表着数据库的接口。这个引擎实例可以执行 SQL 语句,例如:
engine.execute("show tables")
(2)创建会话
光有这个数据库的引擎还不够,还需要建立会话才行,这里要使用引擎来创建一个 Session 类的实例,代码为:
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker # 创建引擎
engine = create_engine("mysql+pymysql://root:qwer1234@127.0.0.1:3306/mydb")
# 使用引擎创建Session
DB_Session = sessionmaker(bind=engine)
# 实例化
db_session = DB_Session()
(3)单表 CRUD
插入数据:
# 插入
db_session.execute("insert into roles values(%d,%s)" % (1, "'admin'"))
db_session.execute("insert into users values(%s,%s,%s,%s,%d)" % ("'user1'", "'man'", "'user1@163.com'", "'12233445566'", 1))
db_session.commit()
插入数据可以使用 SQL 语句来完成,在插入数据之后要使用 commit(),这一点不能忘记。
查询数据:
# 查询
result = db_session.query(User).filter(User.user == "user1")
print(result.all())
usr = result.all()[0]
print(usr.email) # [<SQlAlchemy.models.User object at 0x0000028D33D7CDD8>]
# user1@163.com
在查询的时候需要使用 query() 和 filter(),返回的结果是一个列表,如果列表为空就表示数据库中没有该记录。对于返回的这个结果,使用 all() 返回所有记录,使用 one() 返回第一条记录。
更新数据:
# 更新
db_session.query(User).filter(User.user == "user1").update({User.email: 'user1user1@163.com'})
db_session.commit()
# 查询
result = db_session.query(User).filter(User.user == "user1")
usr = result.one()
print(usr.email) # user1user1@163.com
更新数据可以使用 update() 方法,不过要接在 filter() 之后,使用这种方法即使数据库中没有记录也不会报错。
删除数据:
# 删除
db_session.query(User).filter(User.user == "user1").delete()
# 查询
result = db_session.query(User).filter(User.user == "user1")
usr = result.one()
print(usr.email) # sqlalchemy.orm.exc.NoResultFound: No row was found for one()
删除数据的使用方法和更新数据类似,只不过是在 filter() 之后使用 delete() 方法。
(4)多表查询
假设要查询 phone 为"12233445566"的用户名称和电话所在地址,就需要将 users 表和 phone 表联合起来进行查询,方法是使用多个 filter():
res = db_session.query(User, Phone).filter(User.phone == "").filter(Phone.phone == "")
u, p = res.one()
print(u.user, p.phone_address) # user1 A
假设要查询 user 为"user1"的用户的角色信息,就需要将 users 表和 roles 表联合起来进行查询,因为有外键的关系,所以可以使用 join():
res = db_session.query(User).join(Role).filter(User.user == "user1")
u = res.one()
print(u.user, u.role.role_name) # user1 admin
Flask学习之旅--还是数据库(sqlacodegen + SQL Alchemy)的更多相关文章
- Flask学习之旅--数据库
一.写在前面 在Web开发中,数据库操作是很重要的一部分,因为网站的很多重要信息都保存在数据库之中.而Flask在默认情况下是没有数据库.表单验证等功能的,但是可以用Flask-extension为W ...
- Flask学习之旅--简易留言板
一.写在前面 正所谓“纸上得来终觉浅,方知此事要躬行”,在看文档和视频之余,我觉得还是要动手做点什么东西才能更好地学习吧,毕竟有些东西光看文档真的难以理解,于是就试着使用Flask框架做了一个简易留言 ...
- Flask学习之旅--分页功能:分别使用 flask--pagination 和分页插件 layPage
一.前言 现在开发一个网站,分页是一个很常见的功能了,尤其是当数据达到一定量的时候,如果都显示在页面上,会造成页面过长而影响用户体验,除此之外,还可能出现加载过慢等问题.因此,分页就很有必要了. 分页 ...
- Flask学习之旅--用 Python + Flask 制作一个简单的验证码系统
一.写在前面 现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码.需要拖动滑块的滑动验 ...
- Flask学习之旅--Flask项目部署
一.写在前面 Flask 作为一个轻量级的 Web 框架,具有诸多优点,灵活方便,扩展性强,开发文档也很丰富.在开发调试的过程中,我们往往会使用 Flask 自带的 Web 服务器,但如果要投入到生产 ...
- SQL server学习(一)数据库的基本知识、基本操作和基本语法
在软件测试中,数据库是必备知识,假期闲里偷忙,整理了一点学习笔记,共同探讨. 阅读目录 基本知识 数据库发展史 数据库名词 SQL组成 基本操作 登录数据库操作 数据库远程连接操作 数据库分离操作 数 ...
- SQL 数据库 学习 003 什么是数据库? 为什么需要数据库?是不是所有的软件都是用Sql Server?
什么是数据库? 为什么需要数据库? 是不是所有的软件都是用Sql Server? 我的电脑系统: Windows 10 64位 使用的SQL Server软件: SQL Server 2014 Exp ...
- SQL server学习(一)数据库的基本知识、基本操作(分离、脱机、收缩、备份、还原、附加)和基本语法
在软件测试中,数据库是必备知识,共同探讨. 阅读目录 基本知识 数据库发展史 数据库名词 SQL组成 基本操作 登录数据库操作 数据库远程连接操作 数据库分离操作 数据库脱机.联机操作 数据库收缩操作 ...
- Python 学习 第17篇:从SQL Server数据库读写数据
在Python语言中,从SQL Server数据库读写数据,通常情况下,都是使用sqlalchemy 包和 pymssql 包的组合,这是因为大多数数据处理程序都需要用到DataFrame对象,它内置 ...
随机推荐
- 论文解读2——Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
背景 用ConvNet方法解决图像分类.检测问题成为热潮,但这些方法都需要先把图片resize到固定的w*h,再丢进网络里,图片经过resize可能会丢失一些信息.论文作者发明了SPP pooling ...
- JSP引擎、JSP容器、Web服务器
JSP引擎与JSP容器指的都是同一样的东西,他们都是用来同一管理和运行Web引用程序的“软件”.常见的JSP引擎有Tomcat.JRun.Resin 广义上来说,JSP引擎是用来管理和运行Web应用程 ...
- 40 篇原创干货,带你进入 Spring Boot 殿堂!
两个月前,松哥总结过一次已经完成的 Spring Boot 教程,当时感受到了小伙伴们巨大的热情. 两个月过去了,松哥的 Spring Boot 教程又更新了不少,为了方便小伙伴们查找,这里再给大家做 ...
- poium测试库之JavaScript API封装原理
poium一直我在维护的一个开源项目,它的定位是以极简的方式在自动化项目中Page Objects设计模式.我在之前的文章中也有介绍. 本篇文章主要介绍一个JavaScript元素操作的封装原理. 为 ...
- PL/SQL 监听程序当前无法识别连接描述符中请求的服务解决
PL/SQL 用了几天后再登陆提示监听程序当前无法识别连接描述符中请求的服务,绞尽脑汁各种搜索找到以下解决方案-修改listener.ora文件 一般文件存在:app\Administrator\pr ...
- CAP 2.6 版本发布通告
前言 今天,我们很高兴宣布 CAP 发布 2.6 版本正式版.同时我们也很高兴的告诉你 CAP 在 GitHub 已经突破了3000 Star. 自从上次 CAP 2.5 版本发布 以来,已经过去了几 ...
- Vulkan(0)搭建环境-清空窗口
Vulkan(0)搭建环境-清空窗口 认识Vulkan Vulkan是新一代3D图形API,它继承了OpenGL的优点,弥补了OpenGL的缺憾.有点像科创板之于主板,歼20之于歼10,微信之于QQ, ...
- Linux shell 内部命令与外部命令有什么区别以及怎么辨别
内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留 ...
- Git 忽略某些文件提交
在项目中有些配置文件不需要提交,但是有同学在后面开发中发现在.igonore文件中无论如何都无法忽略某些文件的提交.原因在这里: 已经维护起来的文件,即使加上了gitignore,也无济于事.---- ...
- fiddler的安装于使用(一)安装fiddler
Fiddler的简介 Fiddler是位于客户端和服务器端之间的代理,也是目前最常用的抓包工具之一 .它能够记录客户端和服务器之间的所有 请求,可以针对特定的请求,分析请求数据.设置断点.调试web应 ...