安装flask-sqlalchemy
pip install flask-sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 步骤1:配置创建数据库参数
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + r"D:\workplace\python\TestVue\first.db" # 数据库存放位置
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "major"
## 步骤2:实例化的数据库
db = SQLAlchemy(app)
# 步骤3:以db.Model为基类创建自己的ORM类
class Student(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "student"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(64), nullable=False) # 学生姓名 nullable能否为空
phone = db.Column(db.String(11)) # 手机号 可以为空
if __name__ == '__main__':
# 步骤6:利用db.create_all将ORM模型映射到数据库中
# 注意:将模型映射到数据库中后,即使改变了模型的字段,也不会再重新映射修改表内容。
with app.app_context(): # Create an :class:`~flask.ctx.AppContext`.
db.create_all()
# db.drop_all()
随着项目越来越大,采用写原生SQL的方式在代码中会出现大量的SQL语句,那么问题就出现了: 1.SQL语句重复利用率不高,越复杂的SQL语句条件越多,代码越长。会出现很多相近的SQL语句。 2.很多SQL语句是在业务逻辑中拼出来的,如果有数据库需要更改,就要去修改这些逻辑,这会很容易漏掉对某些SQL语句的修改。 3.写SQL时容易忽略web安全问题,给未来造成隐患。
ORM, 全称object Relational Napping ,中文叫做对象关系映射,通过oRA 我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句。通过把表映射成类,把行作实例,把字段作为属性,oRw在执行对象操作的时候最终还是会把对应的操作转换为数据库原生语句。使用ORN有许多优点: 1.易用性:使用oRM做数据库的开发可以有效的减少重复SQL语句的概率,写出来的模型也更加直观、清晰。 ⒉.性能损耗小:ORW转换成底层数据库操作指令确实会有一些开销。但从实际的情况来看,这种性能损耗很少〈不足5%),只要不是对性能有严苛的要求,综合考虑开发效率、代码的阅读性,带来的好处要远远大于性能损耗,而且项目越大作用越明显。 3.设计灵活:可以轻松的写出复杂的查询。 4.可移植性: SQLAlchemy封装了底层的数据库实现,支持多个关系数据库引擎,包括流行的Ny5QL,PostgreSQL和 sQLite。可以非常轻松的切换数据库。
添加数据
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 步骤1:配置创建数据库参数
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + r"D:\workplace\python\TestVue\first.db" # 数据库存放位置
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "major"
## 步骤2:实例化的数据库
db = SQLAlchemy(app)
# 步骤3:以db.Model为基类创建自己的ORM类
class Student(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "student"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(64)) # 学生姓名 nullable能否为空
test = db.Column(db.String(64)) # 学生姓名 nullable能否为空
phone = db.Column(db.String(11)) # 手机号 可以为空
# 增
def add_data():
s = Student(name="major",test="testa",phone="1777777777")
# 加入session
db.session.add(s)
# session提交
db.session.commit()
# 删
# 改
# 查
if __name__ == '__main__':
# 步骤6:利用db.create_all将ORM模型映射到数据库中
with app.app_context(): # Create an :class:`~flask.ctx.AppContext`.
# 建立表
# db.create_all()
# db.drop_all() # 删除所有表
# 添加数据
add_data()
多对象添加
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 步骤1:配置创建数据库参数
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + r"D:\workplace\python\TestVue\first.db" # 数据库存放位置
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "major"
## 步骤2:实例化的数据库
db = SQLAlchemy(app)
# 步骤3:以db.Model为基类创建自己的ORM类
class Student(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "student"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(64)) # 学生姓名 nullable能否为空
phone = db.Column(db.String(11)) # 手机号 可以为空
# 增
def add_data():
s1 = Student(name="major1",phone="1777777777")
s2 = Student(name="major2",phone="1777777777")
# 加入session
db.session.add_all([s1,s2])
# session提交
db.session.commit()
# 删
# 改
# 查
if __name__ == '__main__':
# 步骤6:利用db.create_all将ORM模型映射到数据库中
with app.app_context(): # Create an :class:`~flask.ctx.AppContext`.
# 建立表
# db.create_all()
# db.drop_all() # 删除所有表
# 添加数据
add_data()
查询所有数据
filter() 按指定条件进行过滤(单表,多表,定值,不定值)
1.查询年龄大于 30 的人的信息
db.session.query(Users).filter(User.age > 30).all()
2.查询id为1的人的信息
db.session.query(Users).filter(Users.id==1).first()
3.查询年龄大于30并且id大于1的用户的信息
filter(条件1,条件2,...)
db.session.query(Users).filter(Users.age > 30, id>1).all()
4.查询年龄大于30或者id为1的用户的信息
查询或者操作,需要使用 or_()
db.session.query(Users).filter(or_(Users.id == 1, Users.age > 30)).all()
5.查询 email 中包含 'w' Users的信息--模糊查询
db.session.query(Users).filter(Users.email.like('%w%'))
6.查询 id 在 [2,4] 列表中的Users的信息
users = db.session.query(Users).filter(Users.id.in_([2, 4])).all()
7.查询Users中age在40-50之间的人的信息 between 45 and 50
filter_by() 按等值条件进行过滤
limit() 按限制行数量获取结果
order_by() 按指定列进行排序
group_by() 按指定条件进行分组
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 步骤1:配置创建数据库参数
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + r"D:\workplace\python\TestVue\first.db" # 数据库存放位置
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "major"
## 步骤2:实例化的数据库
db = SQLAlchemy(app)
# 步骤3:以db.Model为基类创建自己的ORM类
class Student(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "student"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(64)) # 学生姓名 nullable能否为空
phone = db.Column(db.String(11)) # 手机号 可以为空
def __str__(self):
return "<Person(name:%s,phone:%s)>" %(self.name,self.phone)
# 增
def add_data():
s1 = Student(name="major1",phone="1777777777")
s2 = Student(name="major2",phone="1777777777")
# 加入session
db.session.add_all([s1,s2])
# session提交
db.session.commit()
# 删
# 改
# 查
def search_data():
all_stu = db.session.query(Student).all()
print(all_stu)
for i in all_stu:
print(i)
if __name__ == '__main__':
# 步骤6:利用db.create_all将ORM模型映射到数据库中
with app.app_context(): # Create an :class:`~flask.ctx.AppContext`.
# 建立表
# db.create_all()
# db.drop_all() # 删除所有表
# 添加数据
# add_data()
# 查询数据
search_data()
根据name查询数据
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 步骤1:配置创建数据库参数
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + r"D:\workplace\python\TestVue\first.db" # 数据库存放位置
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "major"
## 步骤2:实例化的数据库
db = SQLAlchemy(app)
# 步骤3:以db.Model为基类创建自己的ORM类
class Student(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "student"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(64)) # 学生姓名 nullable能否为空
phone = db.Column(db.String(11)) # 手机号 可以为空
def __str__(self):
return "<Person(name:%s,phone:%s)>" %(self.name,self.phone)
# 增
def add_data():
s1 = Student(name="major1",phone="1777777777")
s2 = Student(name="major2",phone="1777777777")
# 加入session
db.session.add_all([s1,s2])
# session提交
db.session.commit()
# 删
# 改
# 查
def search_data():
# all_stu = db.session.query(Student).all()
# print(all_stu)
# for i in all_stu:
# print(i)
all_stu = db.session.query(Student).filter_by(name="major").all()
print(all_stu)
for i in all_stu:
print(i)
if __name__ == '__main__':
# 步骤6:利用db.create_all将ORM模型映射到数据库中
with app.app_context(): # Create an :class:`~flask.ctx.AppContext`.
# 建立表
# db.create_all()
# db.drop_all() # 删除所有表
# 添加数据
# add_data()
# 查询数据
search_data()
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 步骤1:配置创建数据库参数
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + r"D:\workplace\python\TestVue\first.db" # 数据库存放位置
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "major"
## 步骤2:实例化的数据库
db = SQLAlchemy(app)
# 步骤3:以db.Model为基类创建自己的ORM类
class Student(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "student"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(64)) # 学生姓名 nullable能否为空
phone = db.Column(db.String(11)) # 手机号 可以为空
def __str__(self):
return "<Person(name:%s,phone:%s)>" %(self.name,self.phone)
# 增
def add_data():
s1 = Student(name="major1",phone="1777777777")
s2 = Student(name="major2",phone="1777777777")
# 加入session
db.session.add_all([s1,s2])
# session提交
db.session.commit()
# 删
# 改
# 查
def search_data():
# all_stu = db.session.query(Student).all()
# print(all_stu)
# for i in all_stu:
# print(i)
all_stu = db.session.query(Student).filter(Student.name=="major").all()
print(all_stu)
for i in all_stu:
print(i)
if __name__ == '__main__':
# 步骤6:利用db.create_all将ORM模型映射到数据库中
with app.app_context(): # Create an :class:`~flask.ctx.AppContext`.
# 建立表
# db.create_all()
# db.drop_all() # 删除所有表
# 添加数据
# add_data()
# 查询数据
search_data()
根据主键获取对象
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 步骤1:配置创建数据库参数
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + r"D:\workplace\python\TestVue\first.db" # 数据库存放位置
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "major"
## 步骤2:实例化的数据库
db = SQLAlchemy(app)
# 步骤3:以db.Model为基类创建自己的ORM类
class Student(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "student"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(64)) # 学生姓名 nullable能否为空
phone = db.Column(db.String(11)) # 手机号 可以为空
def __str__(self):
return "<Person(name:%s,phone:%s)>" %(self.name,self.phone)
# 增
def add_data():
s1 = Student(name="major1",phone="1777777777")
s2 = Student(name="major2",phone="1777777777")
# 加入session
db.session.add_all([s1,s2])
# session提交
db.session.commit()
# 删
# 改
# 查
def search_data():
# all_stu = db.session.query(Student).all()
# print(all_stu)
# for i in all_stu:
# print(i)
# all_stu = db.session.query(Student).filter(Student.name=="major").all()
# print(all_stu)
# for i in all_stu:
# print(i)
# 根据主键获取对象
stu = db.session.query(Student).get(2)
print(stu)
if __name__ == '__main__':
# 步骤6:利用db.create_all将ORM模型映射到数据库中
with app.app_context(): # Create an :class:`~flask.ctx.AppContext`.
# 建立表
# db.create_all()
# db.drop_all() # 删除所有表
# 添加数据
# add_data()
# 查询数据
search_data()
使用first方法可以获取结果数据中的第一条数据
stu = db.session.query(Student).first()
修改数据
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 步骤1:配置创建数据库参数
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + r"D:\workplace\python\TestVue\first.db" # 数据库存放位置
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "major"
## 步骤2:实例化的数据库
db = SQLAlchemy(app)
# 步骤3:以db.Model为基类创建自己的ORM类
class Student(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "student"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(64)) # 学生姓名 nullable能否为空
phone = db.Column(db.String(11)) # 手机号 可以为空
def __str__(self):
return "<Person(name:%s,phone:%s)>" %(self.name,self.phone)
# 增
def add_data():
s1 = Student(name="major1",phone="1777777777")
s2 = Student(name="major2",phone="1777777777")
# 加入session
db.session.add_all([s1,s2])
# session提交
db.session.commit()
# 删
# 改
def update_data():
stu = db.session.query(Student).first()
stu.name = "xxxxx"
db.session.commit()
# 查
def search_data():
# all_stu = db.session.query(Student).all()
# print(all_stu)
# for i in all_stu:
# print(i)
# all_stu = db.session.query(Student).filter(Student.name=="major").all()
# print(all_stu)
# for i in all_stu:
# print(i)
# 根据主键获取对象
stu = db.session.query(Student).first()
print(stu)
if __name__ == '__main__':
# 步骤6:利用db.create_all将ORM模型映射到数据库中
with app.app_context(): # Create an :class:`~flask.ctx.AppContext`.
# 建立表
# db.create_all()
# db.drop_all() # 删除所有表
# 添加数据
# add_data()
# 查询数据
# search_data()
# 修改数据
update_data()
删除数据
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 步骤1:配置创建数据库参数
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + r"D:\workplace\python\TestVue\first.db" # 数据库存放位置
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "major"
## 步骤2:实例化的数据库
db = SQLAlchemy(app)
# 步骤3:以db.Model为基类创建自己的ORM类
class Student(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "student"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.String(64)) # 学生姓名 nullable能否为空
phone = db.Column(db.String(11)) # 手机号 可以为空
def __str__(self):
return "<Person(name:%s,phone:%s)>" %(self.name,self.phone)
# 增
def add_data():
s1 = Student(name="major1",phone="1777777777")
s2 = Student(name="major2",phone="1777777777")
# 加入session
db.session.add_all([s1,s2])
# session提交
db.session.commit()
# 删
def delete_data():
stu= db.session.query(Student).first()
db.session.delete(stu)
db.session.commit()
# 改
def update_data():
stu = db.session.query(Student).first()
stu.name = "xxxxx"
db.session.commit()
# 查
def search_data():
# all_stu = db.session.query(Student).all()
# print(all_stu)
# for i in all_stu:
# print(i)
# all_stu = db.session.query(Student).filter(Student.name=="major").all()
# print(all_stu)
# for i in all_stu:
# print(i)
# 根据主键获取对象
stu = db.session.query(Student).first()
print(stu)
if __name__ == '__main__':
# 步骤6:利用db.create_all将ORM模型映射到数据库中
with app.app_context(): # Create an :class:`~flask.ctx.AppContext`.
# 建立表
# db.create_all()
# db.drop_all() # 删除所有表
# 添加数据
# add_data()
# 查询数据
# search_data()
# 修改数据
# update_data()
# 删除数据
delete_data()
sqlalchemy常用数据类型: · Integer :整形。 · Float :浮点类型。 · Boolean:传递True/alse进去。 · DECIMAL:定点类型。 · enum :枚举类型。 . Date :传递datetime.date()进去。 · DateTime :传递datetime.datetime()进去。 · Time :传递datetime.time()进去。 · String :字符类型,使用时需要指定长度,区别于Text 类型。 . Text :文本类型。 . LONGTEXT:长文本类型。
使用Text文本类型存base64图像数据
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
import cv2
import numpy as np
from utils import *
import base64
app = Flask(__name__)
# 步骤1:配置创建数据库参数
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + r"D:\workplace\python\TestVue\first.db" # 数据库存放位置
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "major"
## 步骤2:实例化的数据库
db = SQLAlchemy(app)
def base64_to_opencv(base64_img):
# 从Base64字符串中提取图像数据
img_data = base64.b64decode(base64_img)
# 将图像数据转换为NumPy数组
np_array = np.fromstring(img_data, np.uint8)
# 从NumPy数组创建OpenCV图像
cv_img = cv2.imdecode(np_array, cv2.IMREAD_COLOR)
return cv_img
# 步骤3:以db.Model为基类创建自己的ORM类
class ImageInfo(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "imageInfo"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.Text) # 图像名称
Imgbase64 = db.Column(db.Text) # 图像base64编码数据
def __str__(self):
return "<imageInfo(name:%s)>" %(self.name)
# 增
def add_data():
cv_img = cv2.imread(r"D:\LSR\20614205011\LSR1.bmp",cv2.IMREAD_COLOR)
# 转byte流
ret, buffer = cv2.imencode('.jpg', cv_img)
# 转base64编码
img_base64 = base64.b64encode(buffer).decode('utf-8')
img1 = ImageInfo(name="LS1.bmp",Imgbase64=img_base64)
img2 = ImageInfo(name="LS2.bmp",Imgbase64=img_base64)
# 加入session
db.session.add_all([img1,img2])
# session提交
db.session.commit()
# 查
def search_data():
# all_stu = db.session.query(Student).all()
# print(all_stu)
# for i in all_stu:
# print(i)
# all_stu = db.session.query(Student).filter(Student.name=="major").all()
# print(all_stu)
# for i in all_stu:
# print(i)
# 根据主键获取对象
img1 = db.session.query(ImageInfo).first()
cv_img = base64_to_opencv(img1.Imgbase64)
showImg(cv_img)
if __name__ == '__main__':
# 步骤6:利用db.create_all将ORM模型映射到数据库中
with app.app_context(): # Create an :class:`~flask.ctx.AppContext`.
# 建立表
db.create_all()
# db.drop_all() # 删除所有表
# 添加数据
add_data()
# 查询数据
search_data()
# 修改数据
# update_data()
# 删除数据
# delete_data()
重构为项目格式
exts.py
from exts import db
class ImageInfo(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "imageInfo"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.Text) # 图像名称
Imgbase64 = db.Column(db.Text) # 图像base64编码数据
def __str__(self):
return "<imageInfo(name:%s)>" %(self.name)
main.py
from flask import Flask
import cv2
from exts import db
import numpy as np
from utils import *
import base64
app = Flask(__name__)
# 步骤1:配置创建数据库参数
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + r"D:\workplace\python\TestVue\first.db" # 数据库存放位置
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "major"
## 步骤2:绑定app
db.init_app(app)
def base64_to_opencv(base64_img):
# 从Base64字符串中提取图像数据
img_data = base64.b64decode(base64_img)
# 将图像数据转换为NumPy数组
np_array = np.fromstring(img_data, np.uint8)
# 从NumPy数组创建OpenCV图像
cv_img = cv2.imdecode(np_array, cv2.IMREAD_COLOR)
return cv_img
# 步骤3:以db.Model为基类创建自己的ORM类
class ImageInfo(db.Model):
# 步骤4 确定表名 __tablename__
__tablename__ = "imageInfo"
# 步骤5:利用类属性创建表中字段
id = db.Column(db.Integer, primary_key=True) # 主键
name = db.Column(db.Text) # 图像名称
Imgbase64 = db.Column(db.Text) # 图像base64编码数据
def __str__(self):
return "<imageInfo(name:%s)>" %(self.name)
# 增
def add_data():
cv_img = cv2.imread(r"D:\LSR\20614205011\LSR1.bmp",cv2.IMREAD_COLOR)
# 转byte流
ret, buffer = cv2.imencode('.jpg', cv_img)
# 转base64编码
img_base64 = base64.b64encode(buffer).decode('utf-8')
img1 = ImageInfo(name="LS1.bmp",Imgbase64=img_base64)
img2 = ImageInfo(name="LS2.bmp",Imgbase64=img_base64)
# 加入session
db.session.add_all([img1,img2])
# session提交
db.session.commit()
# 查
def search_data():
# all_stu = db.session.query(Student).all()
# print(all_stu)
# for i in all_stu:
# print(i)
# all_stu = db.session.query(Student).filter(Student.name=="major").all()
# print(all_stu)
# for i in all_stu:
# print(i)
# 根据主键获取对象
img1 = db.session.query(ImageInfo).first()
cv_img = base64_to_opencv(img1.Imgbase64)
showImg(cv_img)
if __name__ == '__main__':
# 步骤6:利用db.create_all将ORM模型映射到数据库中
with app.app_context(): # Create an :class:`~flask.ctx.AppContext`.
# 建立表
db.create_all()
# db.drop_all() # 删除所有表
# 添加数据
add_data()
# 查询数据
search_data()
# 修改数据
# update_data()
# 删除数据
# delete_data()
flask-migrate
在实际的开发环境中,经常会发生数据库修改的行为。一般我们修改数据库不会直接手动的去修改,而是去修改oRM对应的模型,然后再把模型映射到数据库中。这时候如果有一个工具能专门做这种事情,就显得非常有用了,而flask-migrate用于解决这个问题
pip install flask-migrate -i https://pypi.tuna.tsinghua.edu.cn/simple