4.flask-SQLAlchemy,表Model定义、增删查改操作

介绍

SQLAlchemy是对数据库的一个抽象

开发者不用直接与SQL语句打交道

Python对象来操作数据库

SQLAlchemy是一个关系型数据库

安装

flask中SQLAlchemy的配置

python 复制代码
from flask import Flask
from demo.user_oper import user


def create_app():
    app = Flask(__name__)
    # 使用session,就必须设置app.secret_key的值
    app.secret_key = "1"
    app.register_blueprint(user, url_prefix="/web")

    # Flask数据库设置
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@localhost:3308/mp'
    # 动态追踪修改设置,如未设置只会提示警告,不建议开启
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    # 查询时显示原始SQL语句
    app.config['SQLALCHEMY_ECHO'] = True
    return app

创建SQLAlchemy的db对象

python 复制代码
from middle_aware import create_app
from flask_sqlalchemy import SQLAlchemy

app = create_app()

db = SQLAlchemy()

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8080)

定义db.Model

db.ForeignKey(表名.字段名) --表示外键

python 复制代码
from exts import db


# 数据库模块需要继承db.Model
class User(db.Model):
    # 定义表名
    __tablename__ = "user"
    # 定义字段
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(100))
    info = db.Column(db.JSON)


class Address(db.Model):
    # 定义表名
    __tablename__ = "address"
    # 定义字段
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    city = db.Column(db.String(10))

db.session会话管理

在SQLAlchemy中插入、修改、删除操作,均由数据库会话管理。

会话用db.session表示。在准备把数据写入数据库前,要现将数据添加到会话中,然后调用commit()方法提交会话。

db.session.add(user) 添加到数据库的session中。

db.session.add_all([user1, user2]) 添加多个信息到session中。

db.session.commit() 提交数据库的修改

db.session.rollback() 数据库的回滚操作

db.session.delete(user) 删除数据库,需要commit。

删除数据库中所有表结构,重新根据Model中的定义创建新的表结构

db.create_all() 可以根据定义的Model创建表,在给定的数据库中。

db.drop_all() 删除数据库中所有的表。

python 复制代码
from flask import Flask
import config
from exts import db
from demo.views.user_oper2 import user2
from demo.user_oper import user

app = Flask(__name__)
# 绑定配置文件
app.config.from_object(config)
app = Flask(__name__)
# 使用session,就必须设置app.secret_key的值
app.secret_key = "1"
app.register_blueprint(user, url_prefix="/web")
app.register_blueprint(user2, url_prefix="/test")

# Flask数据库设置
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:123456@localhost:3308/python_db?charset=utf8'
# 动态追踪修改设置,如未设置只会提示警告,不建议开启
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 查询时显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True

db.init_app(app)

if __name__ == '__main__':
    # 一定要在Flask 应用上下文的环境中调用了这个方法
    with app.app_context():
        # 删除所有表
        db.drop_all()
        # 根据model文件中定义的表结构创建表
        db.create_all()
    app.run(host="0.0.0.0", port=8080)

数据类型定义

db.session.add_all([user1, user2]) 批量添加数据

python 复制代码
@user2.route("/addBatch", methods=['GET'])
def add_batch_user():
    num = range(5)
    user_list = []
    for i in num:
        user_list.append(User(username='xkj{}'.format(i), password="111111", info={'info':'test'}))
    db.session.add_all(user_list)
    db.session.commit()
    return "success"

用户表添加一条记录后,提交事务,产生唯一标识,可直接取出传入下一个地址表中,建立关联关系

python 复制代码
@user2.route("/add_user_address", methods=['GET'])
def add_user_address():
    user = User(username='小蘑菇', password='123', info={"info": "xxx"})
    db.session.add(user)
    db.session.commit()
    # 提交事务后,新增的用户,就能获取到用户的主键id
    address = Address(user_id=user.id, city="成都")
    db.session.add(address)
    db.session.commit()
    return "success"
python 复制代码
# 打印出所有蓝图的接口访问地址
print(app.url_map)

修改表数据操作

python 复制代码
@user2.route("/upd_user", methods=['GET'])
def upd_user():
    update_user = db.session.query(User).filter(User.id == 1).first()
    if update_user:
        update_user.username = '大王'
    db.session.commit()
    return "update success"

删除数据库表中数据的操作

python 复制代码
@user2.route("/del_user", methods=['GET'])
def del_user():
    update_user = db.session.query(User).filter(User.id == 1).first()
    if update_user:
        db.session.delete(update_user)
        db.session.commit()
    return "delete user"
相关推荐
王强你强3 分钟前
MySQL 高级查询:JOIN、子查询、窗口函数
数据库·mysql
草巾冒小子4 分钟前
brew 安装mysql,启动,停止,重启
数据库·mysql
用户62799471826211 分钟前
南大通用GBase 8c分布式版本gha_ctl 命令-HI参数详解
数据库
The Future is mine17 分钟前
Python计算经纬度两点之间距离
开发语言·python
斯汤雷19 分钟前
Matlab绘图案例,设置图片大小,坐标轴比例为黄金比
数据库·人工智能·算法·matlab·信息可视化
九月镇灵将19 分钟前
GitPython库快速应用入门
git·python·gitpython
SQLplusDB26 分钟前
Oracle 23ai Vector Search 系列之3 集成嵌入生成模型(Embedding Model)到数据库示例,以及常见错误
数据库·oracle·embedding
喝醉酒的小白1 小时前
SQL Server 可用性组自动种子设定失败问题
数据库
兔子的洋葱圈1 小时前
【django】1-2 django项目的请求处理流程(详细)
后端·python·django
chem41111 小时前
Conmon lisp Demo
服务器·数据库·lisp