python mssql bulk_sqlalchemy 批量插入与坑

本文介绍了使用SQLAlchemy在Python中批量插入MSSQL数据库时遇到的问题,即当批量插入的对象中某个实体缺少字段时,所有实体的该字段都无法插入。示例代码展示了如何通过删除特殊字段并确保所有实体包含所有字段来解决这个问题。解决方案是为缺失字段的实体设置None值,以便在批量插入时成功保存数据。
摘要由CSDN通过智能技术生成

默认提供的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

具体原因还没有看源码,以后有时间再研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值