SQLAlchemy批量操作数据

SQLAlchemy 对外提供了批量插入和批量更新的接口,我们可以直接使用,但是有些细节还是要注意, 下面举几个例子.

批量插入

session.bulk_insert_mappings(ModelClass, list(dict()))

把要插入的数据以字典的形式做成列表,然后把列表传入api,就可以实现批量插入的操作,和单条插入比起来效率快了很多。但是有的driver(mysql-connector)好像不支持utf8mb4的数据表编码的表的批量插入,所以构造engine时要注意不要使用utf8mb4的数据库连接

这种插入方法的效率非常高,而且接口操作非常方便,非常适用, 这里有一份关于sqlalchemy性能的对比测试,有兴趣的可以看一下

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from db import User

DB_CONNECT = 'mysql+mysql-connector://root:123@localhost/ooxx?charset=utf8'  # 因为使用的mysql-connector driver,所以此处使用的是utf8编码,否则会报错。如果项目中使用的是utf8mb4,为了兼容可以在这里单独创建一个session而不使用全局的session池;mysqldb等其他driver没有测试过。
engine = create_engine(DB_CONNECT, echo=True)  # 创建engine
DB_Session = sessionmaker(bind=engine)  # 构造session会话
session = DB_Session()  # 创建session

# 下面是要批量插入的数据(User用户表批量导入1000个人)
users = [{'name': 'name%s' % i, 'age': i % 60, 'gender': i % 2} for i in range(1000)]
session.bulk_insert_mappings(User, users)

批量更新

session.bulk_update_mappings(ModelClass, list(dict()))

和批量插入不同的是,批量更新的dict(),必须存在id的key,好让driver知道要更新的是那条记录

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from db import User

DB_CONNECT = 'mysql+mysql-connector://root:123@localhost/ooxx?charset=utf8mb4‘。
engine = create_engine(DB_CONNECT, echo=True)  # 创建engine
DB_Session = sessionmaker(bind=engine)  # 构造session会话
session = DB_Session()  # 创建session

# 下面是要批量插入的数据(User用户表批量导入1000个人)
users = [{'id': i, name': 'name%s' % i, 'age': i % 60, 'gender': i % 2} for i in range(1000)]  # 增加了一个名为id的key, 目的是为了找到要更新的是哪条数据
session.bulk_update_mappings(User, users)

批量删除

正常情况下我们不会使用代码一次删除大量的表数据, 不符合数据库的规范, 但是如果真的有变态的需求需要我们一次大量删除怎么办呢?

sqlalchemy提供了一个批量删除的接口

db.query(User).filter(User.home=='shanghai').delete()  # 删除家在上海的所有用户

可以看出来的这个api操作的某一项数据相同的全部记录, 与这个api类似的还有对应的更新操作, 与上面的批量更新不同,这里更新的记录只能使用同一个更新的数据

db.query(User).filter(User.home=='shanghai').update({User.active: 0})  # 批量更新家在上海的用户

你可能感兴趣的:(python,数据库,orm)