首页 > 数据库 >flask SQLAlchemy 增删改查

flask SQLAlchemy 增删改查

时间:2022-11-18 18:44:08浏览次数:38  
标签:SQLAlchemy return DemoModel flask 改查 db session kwargs id

  • 前言

  一直在用flask + SQLAlchemy, 每次数据联动,因为踩过坑,就更新一下自己的认识,若有错误,请谅解

  • 准备

    • 模块

click==8.1.3
Flask==1.1.2
Flask-SQLAlchemy==2.4.1
greenlet==2.0.1
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
mysqlclient==2.0.3
SQLAlchemy==1.3.24
Werkzeug==1.0.1
    • db 连接

from flask_sqlalchemy import SQLAlchemy


def init(app):
    app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://root:[email protected]:3306/demo"  # 需要改成自己的数据库地址
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True
    app.config['SQLALCHEMY_ECHO'] = True  # 输出sql False 未不输出
    db = SQLAlchemy(app)
    db.init_app(app)
    • ORM

from models.base import (
    db,
    TableOperateMixin,
    GenColumn)


class DemoModel(db.Model, TableOperateMixin):
    """
CREATE TABLE `tb_demo` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `name` varchar(100) NOT NULL DEFAULT '' COMMENT '名称',
  `tag` varchar(100) NOT NULL DEFAULT '' COMMENT '标签',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `last_update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='demo';
    """
    __tablename__ = "tb_demo"

    name = GenColumn(db.String(100), name="name", default="", comment="名称")
    tag = GenColumn(db.String(100), name="tag", default="", comment="标签")

    def __init__(self, **kwargs):
        self.name = kwargs.get("name")
        self.tag = kwargs.get("tag")
        super().__init__()
    • 代码

from models.tb_demo import DemoModel
from models.base import db


class Demo:

    @classmethod
    def query(cls, **kwargs):
        """
        sql 查询
        先获取table 各个column
        然后进行匹配, 组成sql query
        :param kwargs:
        :return:
        """
        column_names = [c.name for c in DemoModel.__table__.columns]
        body = {key: kwargs[key] for key in kwargs if key in column_names}
        select = DemoModel.query
        for key, value in body.items():
            if isinstance(value, list) or isinstance(value, set):
                select = select.filter(getattr(DemoModel, key).in_(list(value)))
            elif isinstance(value, dict):
                for k, v in value.items():
                    select = select.filter(getattr(DemoModel, key)[k] == v)
            else:
                select = select.filter(getattr(DemoModel, key) == value)
        return select

    @classmethod
    def create(cls, **kwargs):
        """
        新增数据
        :param kwargs: dict 字段
        :return:
        """
        with db.session.begin(subtransactions=True) as s:
            s.session.add(DemoModel(**kwargs))

    @classmethod
    def create_to_id(cls, **kwargs):
        """
        新增数据, 并 return model 用于获取自增id
        :param kwargs:
        :return:
        """
        with db.session.begin(subtransactions=True) as s:
            demo = DemoModel(**kwargs)
            s.session.add(demo)
            return demo

    @classmethod
    def bulk_create(cls, *args):
        """
        批量新增数据
        :param args:
        :return:
        """
        demos = []
        for arg in args:
            demos.append(DemoModel(**arg))
        if demos:
            with db.session.begin(subtransactions=True) as s:
                s.session.bulk_save_objects(demos)

    @classmethod
    def bulk_create_to_ids(cls, *args):
        """
        批量新增并返回
        :param args:
        :return:
        """
        demos = []
        for arg in args:
            demos.append(DemoModel(**arg))
        if demos:
            with db.session.begin(subtransactions=True) as s:
                s.session.bulk_save_objects(demos, return_defaults=True)
        return demos

    @classmethod
    def update(cls, _id, **kwargs):
        with db.session.begin(subtransactions=True):
            cls.query(id=_id).update(kwargs, synchronize_session='fetch')

    @classmethod
    def bulk_update(cls, *args):
        """
        批量新增并返回 ** 必须有唯一键, 未设置默认是id, 其他值就是要修改的值
        数据格式:
        [{
            "id": 1,
            "name": "a"
        }, {
            "id": 2,
            "name": "b",
            "tag": "tag"
        }]
        :param args:
        :return:
        """
        with db.session.begin(subtransactions=True) as s:
            s.session.bulk_update_mappings(DemoModel, args)

    @classmethod
    def delete(cls, id_list):
        """
        删除
        * 删除用in 查询时,需要加上 synchronize_session=False 否则抱错
        sqlalchemy.exc.InvalidRequestError: Could not evaluate current criteria in Python: "Cannot evaluate clauselist with operator <function comma_op at 0x10a5db430>". Specify 'fetch' or False for the synchronize_session parameter.
        :param id_list:
        :return:
        """
        with db.session.begin(subtransactions=True):
            cls.query(id=id_list).delete(synchronize_session=False)

  

  

标签:SQLAlchemy,return,DemoModel,flask,改查,db,session,kwargs,id
From: https://www.cnblogs.com/spxinjie6/p/16904220.html

相关文章

  • python 增删改查sqlserver
    importpymssql#打开数据库连接db=pymssql.connect(server='localhost',user='sa',password='888888',database='customerdb')#创建游标对象,并设置返回数据的类型为......
  • flask 基础配置
    1.flask基础配置 1.1配置静态文件与模板目录 #设置静态文件static_url_path='c',template_folder='t'app=Flask(__name__,static_url_path='c',templ......
  • python flask学习之Mac开发flask项目中bash: flask: command not found错误解决
    最近在学习pythonflask时,当使用SQLAlchemy对mysql操作的功能要做flask_migrate迁移在执行flask的命令【flaskdbinit】时,控制台报bash:flask:commandnotfound错误......
  • Flask-SQLAlchemy
    一.介绍SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在DBAPI之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获......
  • MongoDB - 增删改查
    连接标准URI连接语法通常,可以设定标准的URI连接语法,作为连接配置:mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][......
  • 用一维数组来实现增删改查
    privatestaticvoidlibraryDemo(){String[]bookNames={"《西游记》","《红楼梦》","《水浒传》","《三国演义》"};String[]bookAuthor={"吴......
  • Flask 学习-97.Flask-SQLAlchemy 排序 order_by()
    前言order_by()对查询结果排序按字段排序根据id字段排序,默认是正序a=Students.query.order_by(Students.id).all()print(a)使用asc()函数正序a=Student......
  • ABAP-内表增删改查
    *&---------------------------------------------------------------------**&ReportZ10*&*&-----------------------------------------------------------------......
  • Flask 学习-96.Flask-SQLAlchemy 判断查询结果是否存在的几种方式
    前言在查询的时候,经常需要先判断是否存在结果,再进行下一步操作。这里总结了判断查询结果是否存在的几种方式count()统计个数count()方法返回记录条数,使用示例withap......
  • springboot框架中service层抽取增删改查并封装
    1、BaseService.javaimportcatl.mapper.BaseMapper;importtk.mybatis.mapper.entity.Example;importjavax.annotation.Resource;importjava.util.Collections;import......