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. 在ASP.NET Core MVC中构建简单 Web Api

    Getting Started 在 ASP.NET Core MVC 框架中,ASP.NET 团队为我们提供了一整套的用于构建一个 Web 中的各种部分所需的套件,那么有些时候我们只需要做一个简单的 ...

  2. 腾讯开源 MMKV — 基于mmap的高性能通用key-value组件

    一.介绍 MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强.从 2015 年中至今,在 iOS 微信上使用已有近 3 ...

  3. 细说MySQL数据库操作

    目录 基本语法: 字符集和校验规则 字符集 校验规则 校验规则的影响 数据库操作相关指令 查询数据库版本 显示数据库语句 显示数据库创建语句 数据库删除语句 查看当前数据库有多少个用户在操作 基本语法 ...

  4. LabVIEW(七):多态VI

    1.多态VI概念:可以处理多种不同数据类型的VI被称为“多态VI”.多态VI根据输入或输出的 数据类型,再选择调用一个针对这种数据类型实现功能的VI,这些针对某种数据类型实现功能的VI称作“实例VI” ...

  5. python 利用matplotlib中imshow()函数绘图

    matplotlib 是python最著名的2D绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中.通过简单的绘图语 ...

  6. python2程序移植python3的一些注意事项

    1 queue: python2: import Queue python3: import queue 2 queue size: python2: cache = Queue.Queue(maxs ...

  7. LeetCode:1_Two_Sum | 两个元素相加等于目标元素 | Medium

    题目: Given an array of integers, find two numbers such that they add up to a specific target number. ...

  8. JAVA中的Random()函数

    Java中存在着两种Random函数: 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范 ...

  9. 我面试过没有上万人也有十几个,简历要这么写才有hr要你

    今天终于有时间好好给大家写写关于如何写简历,给自己加分了. 这篇文章拖了很久了应该说,本来想在上周写的,但是事情实在是太多,又不想草草了事,所以搁置到现在.今天早上正好空出来了,就马上给大家码出来了. ...

  10. python之使用位运算符实现加法运算

    一哥们去笔试,回来后跟我说了一通面试题,其中有一道题让我很感兴趣: 不使用+号实现加法运算 刚听到后,一脸懵逼,不使用+号怎么算? 问了朋友他也没做这题,不过仔细想了下,不使用+号,是否可以使用其他运 ...