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 os
basedir = 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 Config
app = 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 datetime
class 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.name
class 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_hash
if __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的更多相关文章
- Flask 系列之 部署发布
说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过 Windows 的 WSL,将我们的项目网站部署到 ...
- flask插件系列之SQLAlchemy基础使用
sqlalchemy是一个操作关系型数据库的ORM工具.下面研究一下单独使用和其在flask框架中的使用方法. 直接使用sqlalchemy操作数据库 安装sqlalchemy pip install ...
- flask系列四之SQLAlchemy
一.SQLAlchemy简介 (1)flask_sqlalchemy是一套ORM框架. (2)ORM(Object Relationship Mapping):模型关系映射 (3)ORM的好处:可以让 ...
- 【Python】Flask系列-URL和视图笔记
1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...
- Flask 中的 SQLAlchemy 使用教程
Flask 是一个 python web micro framework.所谓微框架,主要是 flask 简洁与轻巧,自定义程度高.相比 django 更加轻量级. 之前一直折腾 django,得益于 ...
- flask系列四之SQLAlchemy(二)表关系
一.SQLAlchemy外键约束 1.创建外键约束表结构 目标:建立两个表“用户表(user)”和“问题表( question)”,其中问题表中的作者id是是用户表的id即外键的关系.(一个用户可以有 ...
- flask插件系列之SQLAlchemy实用技巧
下面记录一下SQLAlchemy使用的技巧. 在多模块下定义models 如果由多个蓝图下读定义了model模块,在初始化的时候需要加载到上下文中. 当使用flask_Migrate迁移数据库的时候, ...
- Flask系列:数据库
这个系列是学习<Flask Web开发:基于Python的Web应用开发实战>的部分笔记 对于用户提交的信息,包括 账号.文章 等,需要能够将这些数据保存下来 持久存储的三种方法: 文件: ...
- Flask 系列之 Migration
说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过使用 flask-migrate 实现数据库的迁移操 ...
随机推荐
- python 二分查找法
@source_data:数据集 @binary_num:要查找的数 @mid:中间数的键值 def binary_search(source_data,search_num): #传入数据集计算中间 ...
- JSTL标签库的基本教程之核心标签库(二)
JSTL标签库的基本教程之核心标签库(二) 核心标签库 标签 描述 <c:out> 用于在JSP中显示数据,就像<%= ... > <c:set> 用于保存数据 & ...
- 每天学点SpringCloud(九):SpringCloud最常用配置详解
Eureka 属性名 说明 默认值 eureka.server.enable-self-preservation 关闭注册中心的保护机制,Eureka 会统计15分钟之内心跳失败的比例低于85%将会触 ...
- Pycharm Debug调试心得
1.操作步骤: 1-1.添加断点:直接在标记处点击鼠标左键即可.(删除断点只需再点击断点处即可) 1-2.Debug下运行代码 1-3.按照所需调试进行代码调试.Debug的调试方式如下所示: 分别为 ...
- springboot tomcat配置参数列表
springboot tomcat的配置选项大全 server. Port = xxxx server. Address = server. contextPath = server. display ...
- Kali学习笔记5:被动信息收集工具集
1.Shodan SHODAN搜索引擎不像百度谷歌等,它们爬取的是网页,而SHODAN搜索的是设备. 物联网使用过程中,通常容易出现安全问题,如果被黑客用SHODAN搜索到,后果不堪设想. 网站:ht ...
- MySQL 报错ERROR 1054 (42S22): Unknown column 'plugin' in 'mysql.user'
MySQL 我们在创建用户的时候,可能会遇到以下报错: ERROR 1054 (42S22): Unknown column 'plugin' in 'mysql.user' 说明mysq.user ...
- Mybatis自定义SQL拦截器
本博客介绍的是继承Mybatis提供的Interface接口,自定义拦截器,然后将项目中的sql拦截一下,打印到控制台. 先自定义一个拦截器 package com.muses.taoshop.com ...
- 机器学习入门03 - 降低损失 (Reducing Loss)
原文链接:https://developers.google.com/machine-learning/crash-course/reducing-loss/ 为了训练模型,需要一种可降低模型损失的好 ...
- Robot Framework - 3 - 测试库API
08- 创建测试库--发布测试库 ***** 测试库文档 为了便于维护,测试库文档应该从源代码中生成. Robot Framework 有自己的文档工具 libdoc.py生成 API 文档. 一个 ...