今天讲一下flask sqlalchemy
flask sqlalchemy 是基于sqlite3的是orm的一种构架,大部分语法和sqlite3有些类似。简单介绍一下什么是数据库: 正规点的定义就是:数据库是长期存储在计算机内,大量有组织可共享的数据的集合。简单点就是,比如你有一个database(数据库),数据库中有很多表格,就像excel那样子。 表格中有每一列的名字(字段),用来标记每一列是存的什么信息。就这么简单,当然数据还会有些特殊的属性,比如primary key, unique, not null等等。
首先安装命令是:
pip install flask-sqlalchemy
把这个部分的代码命名为config.py
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
basedir = os.path.abspath(os.path.dirname(__file__))
# 我们要把数据库放在当下的文件夹,这个basedir就是当下文件夹的绝对路径
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'student.db')
# 这里注意看,写的是URI,用来告诉程序你的数据库在什么地方存着
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config[‘SQLALCHEMY_COMMIT_TEARDOWN'] = True
# SQLALCHEMY_COMMIT_TEARDOWN 因为数据库每次有变动的时候,数据改变,但不会自动的去改变数据库面的数据,
# 只有你去手动提交,告诉数据库要改变数据的时候才会改变,这里配置这个代表着,不需要你手动的去提交了自动帮你提交了。也就是可以忽略 db.session.commit()
db = SQLAlchemy(app)
# 初始化db
这里说一下数据库URL。如果你要链接数据库,得先告诉程序数据库在哪,无论是local的或者remote的。URL就是那个数据库的位置。
数据库引擎 | URL |
SQLite(Unix) | sqlite:absolute/path/to/database |
SQLite(Windows) | sqlite:///c:/absolute/path/to/database |
所以程序使用数据库URL必须保存到Flask配置对象的SQLALCHEMY_DATABASE_URI 键中(既保存的位置)
配置对象中还有一个很有用的选项,即SQLALCHEMY_COMMIT_ON_TEARDOWN 键,将其设为 True时,每次请求结束后都会自动提交数据库中的变动 (所以一般都设置成False)
basedir = os.path.abspath(os.path.dirname(__file__))
○ 将数据库创建在工程的根目录下,在pyhton内使用os定位到工程路径下很方便
○ 将当前文件传入dirname函数中, 获取当前文件所在的路径, abspath表示 a获取该文件所在的绝对路径,后面以便于创建数据库,表示将student.db存在当前目录下
以下代码存在student.py的文件内:
from config import db
class User(db.Model):
__tablename__ = 'user'
# 定义一下table的名字
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
zid = db.Column(db.Integer)
email = db.Column(db.String(120))
password = db.Column(db.String(120))
role = db.Column(db.String(80))
def __init__(self, name,zid,email, password, role):
self.name = name
self.zid = zid
self.email = email
self.password = password
self.role = role
def __repr__(self):
return '<User %r>' % self.usernam
这个给大家解释一下为什么要primary key, primary key的中文翻译可以理解为主键,像get等命令都是根据主键来直接查找到的,而且在一对多或者是多对多的关系数据里面是用来创建table来关良两个不同的table
这里是sqlite3 所有的类型
类型名 | Python类型 | 说 明 |
Integer | int | 普通整数,一般是 32 位 |
SmallInteger | int | 取值范围小的整数,一般是 16 位 |
BigInteger | int 或 long | 不限制精度的整数 |
Float | float | 浮点数 |
Numeric | decimal.Decimal | 定点数 |
String | str | 变长字符串 |
Text | str | 变长字符串,对较长或不限长度的字符串做了优化 |
Unicode | unicode | 变长 Unicode 字符串 |
UnicodeText | unicode | 变长 Unicode 字符串,对较长或不限长度的字符串做了优化 |
Boolean | bool | 布尔值 |
Date | datetime.date | 日期 |
Time | datetime.time | 时间 |
DateTime | datetime.datetime | 日期和时间 |
Interval | datetime.timedelta | 时间间隔 |
Enum | str | 一组字符串 |
PickleType | 任何 Python 对象 | 自动使用 Pickle 序列化 |
LargeBinary | str | 二进制文件 |
这些是最常使用的SQLAlchemy列选项
|
|
选项名 | 说 明 |
primary_key | 如果设为 True ,这列就是表的主键 |
unique | 如果设为 True ,这列不允许出现重复的值 |
index | 如果设为 True ,为这列创建索引,提升查询效率 |
nullable | 如果设为 True ,这列允许使用空值;如果设为 False ,这列不允许使用空值 |
default | 为这列定义默认值 |
不知道为啥截图就这样了。。。。
在当前文件夹下面进入python3的终端来创造database:
python3
>>> from student import db
>>> db.create_all()
删除所有的表单:
python3
>>> from student import db
>>> db.drop_all()
这时候database已经创建完毕,下面就是往里面存数据 (addStudent.py)
from student import User, db
user1 = User('li','z513','123@qq.com','123','student')
user2 = User('wang','z514','1234@qq.com','123','student')
# 添加数据到数据库
db.session.add(user1)
db.session.add(user2)
#简写:db.session.add_all([user1, user2])
# 表示提交数据
# 修改行
user1.name = 'wang'
db.session.add(user1)
db.session.commit()
# 删除行
db.session.delete(user1)
db.session.commit()
这个地方是用sqlite3的语句查询的结果,接下来教大家用query来查询
from student import *
# 这里表示得到所有的数据, 整个表单的内容
users = User.query.all()
for user in users:
print('Id: ', user.id, ' Name: ', user.name, ' Zid: ', user.zid, ' Role: ',user.role)
# 也可以根据所需来搜索
print ('>>> This is filter_by command <<<')
user = User.query.filter_by(id = 1).first()
print('Id: ', user.id, ' Name: ', user.name, ' Zid: ', user.zid, ' Role: ',user.role)
# 当然还有很多的筛选的语法,还有get, get 要根据primary key来查询
print ('>>> This is get command <<<')
user = User.query.get(2)
print('Id: ', user.id, ' Name: ', user.name, ' Zid: ', user.zid, ' Role: ',user.role)
# 也可以用filter进行模糊搜索
print ('>>> This is filter command <<<')
# .all()的意思是得到所有的数据
users = User.query.filter(User.role.ilike('%dent')).all()
for user in users:
print('Id: ', user.id, ' Name: ', user.name, ' Zid: ', user.zid, ' Role: ',user.role)
常用的过滤器:
过滤器 | 说 明 |
filter() | 把过滤器添加到原查询上,返回一个新查询 |
filter_by() | 把等值过滤器添加到原查询上,返回一个新查询 |
limit() | 使用指定的值限制原查询返回的结果数量,返回一个新查询 |
offset() | 偏移原查询返回的结果,返回一个新查询 |
order_by() | 根据指定条件对原查询结果进行排序,返回一个新查询 |
group_by() | 根据指定条件对原查询结果进行分组,返回一个新查询 |
最常使用的SQLAlchemy查询执行函数
方 法 | 说 明 |
all() | 以列表形式返回查询的所有结果 |
first() | 返回查询的第一个结果,如果没有结果,则返回 None |
first_or_404() | 返回查询的第一个结果,如果没有结果,则终止请求,返回 404 错误响应 |
get() | 返回指定主键对应的行,如果没有对应的行,则返回 None |
get_or_404() | 返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回 404 错误响应 |
count() | 返回查询结果的数量 |
paginate() | 返回一个 Paginate 对象,它包含指定范围内的结果 |
下面会讲多对多的关系