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