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}) # 批量更新家在上海的用户