当前位置: 首页 > 工具软件 > flask_api > 使用案例 >

Flask结合flask_sqlalchemy教程

寿高阳
2023-12-01


一、flask_sqlalchemy是什么?

flask本身没有内置orm框架,需要依赖第三方模块,这里介绍flask_sqlalchemy,而flask_sqlalchemy是一个flask的扩展,本质上是对sqlalchemy的进一步封装,当然也需要sqlalchemy的支持,使用起来和本来的sqlalchemy的orm是一样的。本文主要介绍flask_sqlalchemy的使用以及如何在flask中使用orm。
不知道orm的小伙伴,这里我简单的说明一下。ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。有点类似于springboot项目中的pojo、entity包下的class对象类。

二、使用指南

1.引入库

pip3 install sqlalchemy
pip3 install Flask-SQLAlchemy

2.实例:单表操作应用

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1/mytest' #换成你的数据库信息
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)
	# 构造函数
    def __init__(self, username, email):
        self.username = username
        self.email = email
	# 返回函数
    def __repr__(self):
        return '<User %r>' % self.username

上述对象一旦创建,这个对象就包含 sqlalchemy 和 sqlalchemy.orm 中的所有函数和助手。它还提供一个名为 Model 的类,用于作为声明模型时的 delarative 基类。

from yourapplication import db #引入上个文件中的db对象
db.create_all() #创建数据库和表
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
from yourapplication import User #引入创建好的orm映射对象
admin = User('admin', 'admin@example.com')#创建实例1
guest = User('guest', 'guest@example.com')#创建实例2
db.session.add(admin) 	#将创建好的对象插入数据库
db.session.add(guest)	#将创建好的对象插入数据库
db.session.commit()		#提交操作
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
users = User.query.all() #类似于select * from .....
print(users)
[<User u'admin'>, <User u'guest'>]
admin = User.query.filter_by(username='admin').first()#类似于select * from .... where username = "admin"
print(admin)
<User u'admin'>

3.实例:多表结合应用(外键)

from datetime import datetime


class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80))
    body = db.Column(db.Text)
    pub_date = db.Column(db.DateTime)
    category_id = db.Column(db.Integer, db.ForeignKey('category.id')) #定义ForeignKey外键
    category = db.relationship('Category',backref=db.backref('posts', lazy='dynamic'))#posts 作为动态关系

    def __init__(self, title, body, category, pub_date=None):
        self.title = title
        self.body = body
        if pub_date is None:
            pub_date = datetime.utcnow()
        self.pub_date = pub_date
        self.category = category

    def __repr__(self):
        return '<Post %r>' % self.title

class Category(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return '<Category %r>' % self.name

创建了Post和Category两个对象,其中Post的category属性放的是category对象。

# 创建对象并插入数据库
py = Category('Python')
p = Post('Hello Python!', 'Python is pretty cool', py)
db.session.add(py)
db.session.add(p)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
py.posts.all()
[<Post 'Hello Python!'>]

三、常用操作

1.增

 user = User()
    user.username = 'fuyong'
    user.password = '123'
    # 将新创建的用户添加到数据库会话中
    db.session.add(user)
    # 将数据库会话中的变动提交到数据库中, 如果不commit, 数据库中是没有变化的.
    db.session.commit()

2.删

# 获取用户对象
    user = User.query.filter_by(id=1).first() #查询出id=1的用户
    # 删除用户
    db.session.delete(user)
    #提交数据库会话
    db.session.commit()

3.改

 	# 获取用户对象
    user = User.query.filter_by(id=2).first()
    # 直接赋值更新数据
    user.password = '123567'
    #提交数据库会话
    db.session.commit()

4.查

 # 查询所有用户
    users_list = User.query.all()
    # 查询用户名称为 fuyong 的第一个用户, 并返回用户实例, 因为之前定义数据库的时候定义用户名称唯一, 所以数据库中用户名称为 test 的应该只有一个.
    user = User.query.filter_by(username='fuyong').first()
    # or
    user = User.query.filter(User.username == 'fuyong').first()
    # 模糊查询, 查找用户名以abc 结尾的所有用户
    users_list = User.query.filter(User.username.endsWith('g')).all()
    # 查询用户名不是 fuyong 的第一个用户
    user = User.query.filter(User.username != 'fuyong').first()

四、api总结

# 原生sql语句操作
sql = 'select * from user'
result = db.session.execute(sql)

# 查询全部
User.query.all()
# 主键查询
User.query.get(1)
# 条件查询
User.query.filter_by(User.username='name')
# 多条件查询
from sqlalchemy import and_
User.query.filter_by(and_(User.username =='name',User.password=='passwd'))
# 比较查询
User.query.filter(User.id.__lt__(5)) # 小于5
User.query.filter(User.id.__le__(5)) # 小于等于5
User.query.filter(User.id.__gt__(5)) # 大于5
User.query.filter(User.id.__ge__(5)) # 大于等于5
# in查询
User.query.filter(User.username.in_('A','B','C','D'))
# 排序
User.query.order_by('age') # 按年龄排序,默认升序,在前面加-号为降序'-age'
# 限制查询
User.query.filter(age=18).offset(2).limit(3)  # 跳过二条开始查询,限制输出3条
# 增加
use = User(id,username,password)
db.session.add(use)
db.session.commit() 
# 删除
User.query.filter_by(User.username='name').delete()
# 修改
User.query.filter_by(User.username='name').update({'password':'newdata'})
 类似资料: