sqlalchemy 批量插入与坑

默认提供的bulk_save_objects是在一次事务中提交多次save

需求:一个sql语句插入多个实体
直接上代码

models.py

from sqlalchemy import (Column, String, DateTime, UnicodeText, BigInteger, Boolean, Integer, Text, Float)
from sqlalchemy import TypeDecorator
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
class People(Base):
    """
    people类
    """
    __tablename__ = 'people'

    id = Column(Integer, primary_key=True, unique=True, index=True, autoincrement=False)
    name = Column(String(100))
    age = Column(Integer, default=0)
    add_time = Column(DateTime, default=datetime.now, nullable=False)

#注意 sqlalchemy字段默认可以为空,和django model相反

views.py

value_list = []
dict_list = []

people1 = People()
people2 = People()

value_list.append(people1)
value_list.append(people2)

for item in value_list:
    item_dict = item.__dict__
    if "_sa_instance_state" in item_dict:
        del item_dict["_sa_instance_state"]
        dict_list.append(item_dict)


engine = create_engine('mssql+pymssql://user:password@127.0.0.1:1433/data')
DBSession = sessionmaker(bind=engine)
session = TWDBSession()
session.execute(timeline.__table__.insert(dict_list))
session.commit()


这里有个巨大的坑,如果people中任何一个实体没有某个字段,则即使其他实体有该字段也无法将该值插入到数据库中, 如下代码:

people1 = People()

people1.name = "bobby1"

people2 = People()

people2.name = "bobby1"
people2.age = 3

#注意people1没有设置age字段, 则在批量插入的时候, people1和people2都在数据库中都没有age字段。
解决办法:  
    加上people1.age = None
    
具体原因还没有看源码,以后有时间再研究
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容