ORM模型
一、概念
对象关系映射,object relationship mapping,简称ORM,是一种可以用Python面向对象的方式来操作关系型数据库的技术,具有可以映射到数据库表能力的Python类,我们称之为ORM模型。一个ORM模型对应一个数据库表,ORM模型中的每个类属性对应表中的每个字段,ORM模型的每个实例对象对应表中的每条记录。ORM提供了面向对象与SQL交互的桥梁,可以用面向对象的方式来操作数据库,具有以下特点:
1、高效:几乎不需要编写原生SQL语句,使用纯Python的方式来操作数据库表。
2、安全:ORM模型底层代码对一些安全问题做了防护,例如SQL注入。
3、灵活:Flask-SQLAlchemy底层支持SQLite、MYSQL、Oracle、PostgreSQL等关系型数据库,但针对不同的数据库,ORM模型的代码几乎一致,当底层数据库变更时,只需修改少量代码。
二、实例
下面用Flask-SQLAlchemy创建一个User模型并在数据库中创建对应的user表。
# -*- coding: utf-8 -*-
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text
app = Flask(__name__)
# MYSQL所在的主机名
HOSTNAME = "localhost"
# MYSQL监听的端口号
PORT = 3306
# 连接MYSQL的用户名
USERNAME = "root"
# 用户名对应密码
PASSWORD = "root"
# MYSQL数据库名称
DATABASE = "demo1"
app.config["SQLALCHEMY_DATABASE_URI"] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"
db = SQLAlchemy(app)
with app.app_context():
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100))
password = db.Column(db.String(100))
db.create_all()
if __name__ == "__main__":
app.run(debug=True)
运行上面代码后,可以看到数据库中多了对应的user表。
三、CRUD
使用ORM进行CRUD操作需要先把操作添加到会话中,通过db.session可以获取会话对象。
1、Create
@app.route('/user/add')
def user_add():
user1 = User(username='u1', password='111111')
user2 = User(username='u2', password='222222')
user3 = User(username='u3', password='333333')
db.session.add(user1)
db.session.add(user2)
db.session.add(user3)
db.session.commit()
return "用户添加success"
2、Read
@app.route('/user/fetch')
def user_fetch():
users = User.query.all() # 获取user表所有数据
user1 = User.query.get(1) # 获取user表中主键为1的数据
user2 = User.query.first() # 获取user表中第一条数据
return "用户读取success"
过滤: query.filter()、query.filter_by()、query.order_by()、query.group_by()、query.slice()、query.limit()、query.offset()等
@app.route('/user/filter', methods=["GET"])
def user_filter():
# query.filter()
users1 = User.query.filter(User.username == 'u2').all()
users2 = User.query.filter(User.username.contains('2'))
users3 = User.query.filter(User.username.like('%2%'))
users4 = User.query.filter(User.username.in_(['u2', 'u22', 'u222']))
users5 = User.query.filter(~User.username.in_(['u2', 'u22', 'u222'])) # not in
users6 = User.query.filter(User.username.is_(None))
users7 = User.query.filter(User.username == None)
users8 = User.query.filter(User.username != None)
users9 = User.query.filter(User.username.isnot(None))
from sqlalchemy import and_, or_
users10 = User.query.filter(and_(User.username == 'u2', User.id < 5))
users11 = User.query.filter(or_(User.username == 'u2', User.id < 5))
# query.filter_by()
users12 = User.query.filter_by(username='u2').all()
# query.order_by()
users13 = User.query.order_by('id')
users14 = User.query.order_by(User.id)
users15 = User.query.order_by(User.id.desc()) # 倒序排序
return "用户filter success"
3、Update
修改一条数据:user = User.query.get(1) user.username='new username' db.session.commit()
修改多条数据:User.query.filter(User.username.contains('u2')).update({'password': 'new password'}, synchronize_session=False) db.session.commit()
4、Delete
删除一条数据:user = User.query.get(1) db.session.delete(user) db.session.commit()
删除多条数据:User.query.filterr(User.username.contains('u2')).delete(synchronize_session=False) db.session.commit()

浙公网安备 33010602011771号