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的更多相关文章

  1. Flask 系列之 部署发布

    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过 Windows 的 WSL,将我们的项目网站部署到 ...

  2. flask插件系列之SQLAlchemy基础使用

    sqlalchemy是一个操作关系型数据库的ORM工具.下面研究一下单独使用和其在flask框架中的使用方法. 直接使用sqlalchemy操作数据库 安装sqlalchemy pip install ...

  3. flask系列四之SQLAlchemy

    一.SQLAlchemy简介 (1)flask_sqlalchemy是一套ORM框架. (2)ORM(Object Relationship Mapping):模型关系映射 (3)ORM的好处:可以让 ...

  4. 【Python】Flask系列-URL和视图笔记

    1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...

  5. Flask 中的 SQLAlchemy 使用教程

    Flask 是一个 python web micro framework.所谓微框架,主要是 flask 简洁与轻巧,自定义程度高.相比 django 更加轻量级. 之前一直折腾 django,得益于 ...

  6. flask系列四之SQLAlchemy(二)表关系

    一.SQLAlchemy外键约束 1.创建外键约束表结构 目标:建立两个表“用户表(user)”和“问题表( question)”,其中问题表中的作者id是是用户表的id即外键的关系.(一个用户可以有 ...

  7. flask插件系列之SQLAlchemy实用技巧

    下面记录一下SQLAlchemy使用的技巧. 在多模块下定义models 如果由多个蓝图下读定义了model模块,在初始化的时候需要加载到上下文中. 当使用flask_Migrate迁移数据库的时候, ...

  8. Flask系列:数据库

    这个系列是学习<Flask Web开发:基于Python的Web应用开发实战>的部分笔记 对于用户提交的信息,包括 账号.文章 等,需要能够将这些数据保存下来 持久存储的三种方法: 文件: ...

  9. Flask 系列之 Migration

    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过使用 flask-migrate 实现数据库的迁移操 ...

随机推荐

  1. tcpdump完全指南

    先从第一个最简单的抓包指令开始 抓经过本主机上的所有网络接口的所有ARP.ICMP.IGMP.IP.TCP.UDP等所有网络包(以下简称“所有网络包”) tcpdump -i any -vnn (注: ...

  2. Android逆向之静态分析

    想必打过CTF的小伙伴多多少少都触过Android逆向,所以斗哥将给大家整一期关于Android逆向的静态分析与动态分析.本期先带来Android逆向的静态分析,包括逆向工具使用.文件说明.例题解析等 ...

  3. JavaScript大厦之JS运算符

    运算符用于执行程序代码运算,会针对一个及以上操作数项目来进行运算.2+3,其操作数是2和3,而运算符则是“+”.上一篇我们说过变量用来存储数据,而同一个变量中的数据在不同的时刻可以不同,在程序的运行过 ...

  4. javascript之location详解

    window.location.hash 使用说明 今天给大家详细汇总了关于window.location.hash的知识点,属性以及用法等等,非常的实用,并附上了例子,有需要的小伙伴可以参考下. l ...

  5. Git使用详细教程(3):git add, git commit详解

    在使用git之前,我们首先要初始化一个git管理的仓库,这里以博客(blog)为例 git init blog 我们进入目录,执行git status查看git状态,可以看到一个新的git管理的项目目 ...

  6. 第53节:Java当中的IO流(上)

    Java当中的IO流 在Java中,字符串string可以用来操作文本数据内容,字符串缓冲区是什么呢?其实就是个容器,也是用来存储很多的数据类型的字符串,基本数据类型包装类的出现可以用来解决字符串和基 ...

  7. C语言那年踩过的坑--局部变量,静态变量,全局变量在内存中存放的位置

    先看几个概念: 1.bss是英文block started by symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0.bss段属于静态内存分配.它的初始 ...

  8. Java 中初始化 List 集合的 6 种方式!

    List 是 Java 开发中经常会使用的集合,你们知道有哪些方式可以初始化一个 List 吗?这其中不缺乏一些坑,今天栈长我给大家一一普及一下. 1.常规方式 List<String> ...

  9. ModelState 错误信息输出

    在MVC的项目中,我们通常情况下,为了方便(偷懒),会直接使用 !ModelState.IsValid 来判断实体的验证是否正确,但是这样对于用户的体验是不好的,当填写的内容比较多的时候,用户需要自己 ...

  10. odoo开发笔记 -- 模型字段定义中设置默认值

    例如: company_id = fields.Many2one('res.company', string='Company', default=lambda self: self.env['res ...