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()

posted @ 2024-09-21 18:01  少年不太冷2  阅读(27)  评论(0)    收藏  举报