Flask 系列之 SQLAlchemy
SQLAlchemy 是一种 ORM 框架,通过使用它,可以大大简化我们对数据库的操作,不用再写各种复杂的
sql语句
了。
说明
- 操作系统:Windows 10
- Python 版本:3.7x
- 虚拟环境管理器:virtualenv
- 代码编辑器:VS Code
实验目标
实现网站与 mysql 数据库的连接和 CRUD 操作。
MYSQL 的安装与配置
打开 Ubuntu 16.04 的 bash 界面,执行下述操作
# 安装
sudo apt update && sudo apt install mysql-server mysql-client
sudo service mysql status# 配置安全性
sudo mysql_secure_installation
sudo mysqladmin -p -u root version# 查看状态
sudo service mysql status
sudo service mysql start
sudo service mysql stop# 设置字符编码
sudo vim /etc/mysql/conf.d/mysql.cnf# 修改如下:
[mysql]
no-auto-rehash
default-character-set=utf8
[mysqld]
socket = /var/run/mysqld.sock
port =3306
character-set-server=utf8 # 必须设置,否则会导致无法插入中文数据# 重启服务
sudo service mysql restart
mysql 常用用法
# 进入 mysql
mysql -u root -p# 查看当前字符编码
show variables like 'character%';# 创建数据库 db_name
create database db_name charset=utf8;# 显示以存在的所有数据库
show databases;# 指定数据库 db_name
use db_name;# 创建数据库表
create table table_name;# 查看表信息
desc tablename;# 删除 数据库 db_name
drop database db_name;# 退出
exit;
使用 SQLAlchemy
首先进入 mysql 的控制台界面,创建我们需要使用的数据库
sudo mysql -u root -p
create database todo;
use todo;
安装 flask-sqlalchemy
pip install pymysql
pip install flask-sqlalchemy
在 todolist
目录下创建 config.py 文件,示例代码如下所示:
import osbasedir = os.path.abspath(os.path.dirname(__file__))class Config(object):SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI') or 'mysql+pymysql://root:mysql@127.0.0.1:3306/todo'SQLALCHEMY_TRACK_MODIFICATIONS = False
修改 todolist\app\__init__.py
,示例代码如下所示:
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from config import Configapp = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)@app.route('/')
@app.route('/index')
def index():title = 'Home'greet = 'Hello World'return render_template('index.html', title=title, greet=greet)
在 todolist
目录下创建 models.py 文件,示例代码如下所示:
from app import db
from datetime import datetimeclass User(db.Model):__tablename__ = 'users'# __table_args__ = {"useexisting": True}id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(20), nullable=False, unique=True)email = db.Column(db.String(120), nullable=False, unique=True)pwd = db.Column(db.String(120), nullable=False)things = db.relationship('Thing', backref='User', lazy='dynamic')def __repr__(self):return "<User %r>" % self.nameclass Thing(db.Model):__tablename__ = 'things'# __table_args__ = {"useexisting": True}id = db.Column(db.Integer, primary_key=True)user_id = db.Column(db.Integer, db.ForeignKey('users.id'))title = db.Column(db.String(20), nullable=False)text = db.Column(db.Text, nullable=False)add_date = db.Column(db.DateTime, default=datetime.now)def __repr__(self):return "<Todo %r>" % self.id
修改 todolist\manage.py
,示例代码如下所示:
from app import app, db
from models import User, Thing
from werkzeug.security import generate_password_hashif __name__ == "__main__":db.drop_all()db.create_all()pwd = generate_password_hash('123456789')u1 = User(name='admin', email='admin@outlook.com', pwd=pwd)db.session.add(u1)db.session.commit()t1 = Thing(user_id=1, title='hello world', text='welcome to my hippiedom.')db.session.add(t1)db.session.commit()u2 = User.query.get(1)print(u2)app.run(debug=True, host='0.0.0.0', port=5000)
此时,执行 python manage.py
,若程序无数据库相关的错误信息,则表明数据库中相应表已经创建成功,我们可以在 mysql 的 shell 窗口进行查看。
SQLAlchemy常用操作:
查询所有用户数据User.query.all()查询有多少个用户User.query.count()查询第1个用户User.query.first()User.query.get(1) # 根据id查询查询id为4的用户[3种方式]User.query.get(4)User.query.filter_by(id=4).all() # 简单查询 使用关键字实参的形式来设置字段名User.query.filter(User.id == 4).all() # 复杂查询 使用恒等式等其他形式来设置条件查询名字结尾字符为g的所有用户[开始 / 包含]User.query.filter(User.name.endswith("g")).all()User.query.filter(User.name.startswith("w")).all()User.query.filter(User.name.contains("n")).all()User.query.filter(User.name.like("%n%g")).all() 模糊查询查询名字和邮箱都以li开头的所有用户[2种方式]User.query.filter(User.name.startswith("li"), User.email.startswith("li")).all()from sqlalchemy import and_User.query.filter(and_(User.name.startswith("li"), User.email.startswith("li"))).all()查询age是25 或者 `email`以`itheima.com`结尾的所有用户from sqlalchemy import or_User.query.filter(or_(User.age == 25, User.email.endswith("itheima.com"))).all()查询名字不等于wang的所有用户[2种方式]from sqlalchemy import not_User.query.filter(not_(User.name == "wang")).all()User.query.filter(User.name != "wang").all()查询id为[1, 3, 5, 7, 9]的用户User.query.filter(User.id.in_([1, 3, 5, 7, 9])).all()所有用户先按年龄从小到大, 再按id从大到小排序, 取前5个User.query.order_by(User.age, User.id.desc()).limit(5).all()分页查询, 每页3个, 查询第2页的数据pn = User.query.paginate(2, 3)pn.items 获取该页的数据 pn.page 获取当前的页码 pn.pages 获取总页数
常用 API 参考
# 基本使用
db.drop_all()
db.create_all()
db.session.add(对象)
db.session.commit()# 数据类型
db.Integer:整型
db.String (size):字符串,size 为最大长度,比如 db.String(20)
db.Text:长文本
db.DateTime:时间日期,Python datetime 对象
db.Float:浮点数
db.Boolean:布尔值# 过滤方法
格式:<模型类>.query.<过滤方法(可选)>.<查询方法>
filter():使用指定的规则过滤记录,返回新产生的查询对象
filter_by():使用指定规则过滤记录(以关键字表达式的形式),返回新产生的查询对象
order_by():根据指定条件对记录进行排序,返回新产生的查询对象
group_by():根据指定条件对记录进行分组,返回新产生的查询对象# 查询方法
all():返回包含所有查询记录的列表
first():返回查询的第一条记录,如果未找到,则返回None
get(id):传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回None
count():返回查询结果的数量
first_or_404():返回查询的第一条记录,如果未找到,则返回404错误响应
get_or_404(id):传入主键值作为参数,返回指定主键值的记录,如果未找到,则返回404错误响应
paginate():返回一个Pagination对象,可以对记录进行分页处理
参考
- flask-sqlalchemy
转载于:https://www.cnblogs.com/hippieZhou/p/10273383.html
Flask 系列之 SQLAlchemy相关推荐
- Flask 系列之 部署发布
说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过 Windows 的 WSL,将我们的项目网站部署到 ...
- 【建议收藏】Flask系列教程(三)SQLAlchemy数据库
数据库是一个网站的基础,在Flask中可以自由的使用MySQL.PostgreSQL.SQLite.Redis.MongoDB来写原生的语句实现功能,也可以使用更高级别的数据库抽象方式,如SQLAlc ...
- Python框架Flask系列教程(1)——基础-黄勇-专题视频课程
Python框架Flask系列教程(1)--基础-4431人已学习 课程介绍 从初级讲解Flask开发网站.涉及到的知识点包括:URL和视图.Jinja2模版.SQLAlchemy数据 ...
- flask系列---模板的继承及Bootstrap实现导航条(四)
在建设一个网站的时候,不同的页面有很多元素是一样的,比如导航条.侧边栏等,我们可以使用模板的继承,避免重复编写html代码.现在我们打算实现一个在网页上方的导航条,并在所有的页面中继承这个导航条.导航 ...
- Flask系列教程(23)——SQLAlchemy的ORM(4)
SQLAlchemy的ORM(4) 如果想深入学习Flask,可以观看这套免费Flask教学视频:零基础:Flask入门到项目实战 表关系: 表之间的关系存在三种:一对一.一对多.多对多.而SQLAl ...
- flask中文文档_「Flask系列」 初识Flask
引子 作者有多年的编程打杂经验,之前一直参与基于Java的各种项目以及产品规划与设计,后因自己创业维持一家小公司,有些项目与产品,想降低开发成本,故在公司内部推行基于Python Flask的后端开发 ...
- flask + 蓝图 用 sqlalchemy 对 mysql 进行 增删查改 的 demo
main.py import uuid # UUID: 通用唯一标识符 # from flask import Flask from flask import Flask, request, json ...
- Web框架——Flask系列之蓝图Blueprint(二十一)
一.为什么学习蓝图? 我们学习Flask框架,是从写单个文件,执行hello world开始的.我们在这单个文件中可以定义路由.视图函数.定义模型等等.但这显然存在一个问题:随着业务代码的增加,将所有 ...
- Web框架——Flask系列之数据库迁移(二十)
一.Flask-Migrate扩展 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模 ...
- Web框架——Flask系列之综合案例——图书管理系统(十)
一.知识点: 表单创建 数据库操作 一对多关系演练 二.实现步骤: 创建数据库配置信息,定义模型类 创建数据库表,添加测试数据 编写html页面,展示数据 添加数据 删除书籍,删除作者 三.创建数据库 ...
最新文章
- webgl值得重视的基础构建
- 2021-04-14 Matlab实现模糊聚类分析 FCM
- 机器学习理论《统计学习方法》学习笔记:第五章 决策树
- CSS3中:nth-child和:nth-of-type的区别深入理解。 关于:nth-child和:nth-of-type的区别之前一直没太注意,经深入理解才发现里面其实暗藏玄机...
- vue中的ES6语法整理1
- Linux 设备文件的创建和mdev
- jQuery ligerUI中通过ligerDateEditor设置默认日期
- 【1】推荐系统评测指标
- 四舍五入算法 php,3种PHP实现四舍五入的方法
- android bitmap to base64_Android基础(11)—你需要知道的内存知识
- NodeJS仿WebApi路由
- JavaScript权威指南 - 数组
- 实现Springboot整合UReport2
- elastic search 如何将yellow 状态变为green健康状态
- stm32学习之定时器中断时间设置与计算
- 微信php页面你画我猜,微信小程序你画我猜
- SQL(之一)-SQL经典题目
- 哥德尔不完全性定理 悖论式陈述 PM不可判定命题,和哥德尔可表达性定理——哥德尔读后之十八
- 我的STM32 IAP BOOT跳转到APP进入HardFault_Handler解决方案
- 【JAVA程序设计】(C00046)javaweb图书借阅管理系统