赞
踩
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'})
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。