数据库简介
数据库是一个网站的基础。 Flask 可以使用很多种数据库。比
如 MySQL , MongoDB , SQLite , PostgreSQL 等。这里我们以 MySQL 为例进行讲解。而
在 Flask 中,如果想要操作数据库,我们可以使用 ORM 来操作数据库,使用 ORM 操作数据库将 变得非常简单
环境安装
在Flask操作数据库之前 需要安装这几个操作库
pip install pymysql
pip install SQLAlchemy
SQLAlchemy : SQLAlchemy 是一个数据库的 ORM 框架
通过SQLAlchemy 连接数据库
from sqlalchemy import create_engine
HOSTNAME = '127.0.0.1'#数据库地址
PORT = '3306'#端口号
DATABASE = 'world'#库名
USERNAME = 'root'#用户名
PASSWORD = '123456'#密码
#把配置信息和以上的连接数据 组合一下 指向DB_URL
DB_URL = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset-utf-8'
#create_engine 创建数据库引擎 create_engine函数需要传递一个DB_url指向的字符串 链接数据库
engine = create_engine(DB_URL)
#判断是否链接成功
conn = engine.connect()
result = conn.execute('select * from user ')
print(result.fetchone())
ORM
对象关系映射 是用来描述对象和数据库之间映射的一种方式
ORM的好处
更加规范SQL 不需要手写SQL DB工程师
更加直观的数据关系 ---->对象 方便建模
可以屏蔽不同数据库直接的差异
ORM怎么理解
将表映射成class
将表中的数据 映射成Class的实例对象
ORM操作数据库
使用ORM创建表
要使用 ORM 来操作数据库,首先需要创建一个类来与对应的表进行映射。现在以 User表 来做为 例子,它有 自增长的id 、 name 、 fullname 、 password 这些字段,那么对应的类为:
先用一个伪代码 演示一下
class User(object):
"""User类就是一个数据表
下面的 id、name、usernama、password 是类的属性,相当于数据库字段
"""
id=id,
name=name,
username=username,
password=password
# 这个实例化对象 就相当于把User内的参数映射成了一条数据
#SQLAlchemy之后会在 底层执行这条数据库语句
U = User('xxx','xxx')
那么这样 操作数据库 就会像操作类那样 轻松了 上面的是理清思路的伪代码 不作为执行
字段的数据类型
字段的数据类型 只能是sqlalchemy提供的类型 所以需要导入sqlalchemy下的Column类来指定数据类型
id = Column(Integer, primary_key=True, nullable=False,autoincrement=True)
Column 类的参数:
- 第一个参数:是数据类型 Integer 是整型 String 是字符类型
- primary_key:是否为主键
- nullable:是否为空
- autoincrement:是否自增长
- default :默认值
- unique :是否唯一
开始创建数据表
from sqlalchemy import create_engine,Column,Integer,String
from sqlalchemy.ext.declarative import declarative_base#导入declarative_base用于返回ORM需要的基类
HOSTNAME = '127.0.0.1'#数据库地址
PORT = '3306'#端口号
DATABASE = 'world'#库名
USERNAME = 'root'#用户名
PASSWORD = '123456'#密码
#把配置信息和以上的连接数据 组合一下 指向DB_URL
DB_URL = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset-utf-8'
#create_engine 创建数据库引擎 create_engine函数需要传递一个字符串 链接数据库
engine = create_engine(DB_URL)
"""以上是链接信息"""
"""以下是创建数据表的ORM"""
#将创建好的数据库引擎传入declarative_base方法中,会创建一个对象
base = declarative_base(engine)
#1、创建一个ORM模型 这个ORM模型必须继承自sqlalchemy提供的基类
class Users(base):
"""给表起名字: tablename的属性值是数据表的名字"""
__tablename__ = 'users'
#2、添加类的属性与数据表的字段进行一一映射,这些属性的数据类型 必须是sqlalchemy提供的数据类型
id = Column(Integer, primary_key=True, nullable=False,autoincrement=True)
name = Column(String(50), nullable=False)#String也是一个类 需要传递一个长度参数 这里我设置成50
age = Column(Integer,primary_key=False, nullable=False)
#3、将创建好的ORM模型 映射到数据库中执行 创建数据表
base.metadata.create_all()
创建表的ORM模型就写好了 运行一下
需要注意:使用metadata.create_all() 创建表以后 后续再添加更改表字段 也不会再映射了
sqlalchemy常用数据类型
Integer :整形。
Float :浮点类型。
Boolean :传递 True/False 进去。
DECIMAL :定点类型。
enum :枚举类型。
Date :传递 datetime.date() 进去。
DateTime :传递 datetime.datetime() 进去。
Time :传递 datetime.time() 进去。
String :字符类型,使用时需要指定长度,区别于 Text 类型。
Text :文本类型。
LONGTEXT :长文本类型
使用ORM进行增删改查操作
构建Session对象
1、需要先构建session对象 所有的数据库的ORM操作都必须通过 叫Session的会话对象来实现 通过以下代码来获取会话对象
from sqlalchemy.orm import sessionmaker#导入sessiond对象 它的作用和declarative_base有些类似
#数据库引擎
engine = create_engine(DB_URL)
#数据库引擎装载这数据库链接信息
#将数据库引擎传入sessionmaker内 返回一个对象
Session = sessionmaker(engine)
session = Session()#将返回的对象需要再次进行实例化
"""上面两行创建Session对象的代码 也可以用下面的一行代码表示"""
session = sessionmaker(engine)()
增加数据
from sqlalchemy import create_engine,Column,Integer,String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker#导入sessiond对象 它的作用和declarative_base有些类似
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'world'
USERNAME = 'root'
PASSWORD = '123456'
DB_URL = f'mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset-utf-8'
#数据库引擎
engine = create_engine(DB_URL)
base = declarative_base(engine)
#构建session对象
session = sessionmaker(engine)()
class Users(base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, nullable=False,autoincrement=True)
name = Column(String(50), nullable=False)
age = Column(Integer,primary_key=False, nullable=False)
"""--------以下是插入数据的操作-------"""
def add_data():
"""增操作"""
#将要插入的一条数据传到Users的对象中
u = Users(name="zhiliao",age=18)
#调用session的add方法 把数据传进去
session.add(u)
#这个时候 数据还只在内存中 还需要执行commit才能写入数据库
session.commit()
if __name__ == "__main__":
add_data()
'''上面是添加单条数据,再来试一下 一次多条数据'''
def add_data():
"""增操作"""
#将要插入的数据传到Users的对象中
u1 = Users(name="wuya",age=18)
u2 = Users(name="sanmu",age=21)
#u1、u2先放在列表中然后用add_all方法进行添加
session.add_all([u1,u2])
#这个时候 数据还只在内存中 还需要执行commit才能写入数据库
session.commit()
if __name__ == "__main__":
add_data()
查询数据操作
查询全部
调用session的query方法查询Users模型对应的表中查找数据 后面**all()**方法可以把这张表符合条件的数据全部查找出来
def search_data():
"""查操作"""
#调用session对象下的query方法
all_Users = session.query(Users).all()
print(all_Users)
if __name__ == "__main__":
search_data()
>>>[<__main__.Users object at 0x000001A06265C880>, <__main__.Users object at 0x000001A06265C8E0>, <__main__.Users object at 0x000001A06265CA60>, <__main__.Users object at 0x000001A06265CAF0>]
query可用参数
- 模型对象。指定查找这个模型中所有的对象。
- 模型中的属性。可以指定只查找某个模型的其中几个属性。(查出指定字段 等价于:select age) 只查age字段
- 聚合函数。
func.count :统计行的数量。
func.avg :求平均值。
func.max :求最大值。
func.min :求最小值。
func.sum :求和。