MySQL Sqlalchemy add_all() 忽略重复键 IntegrityError
在本文中,我们将介绍如何使用MySQL Sqlalchemy的add_all()函数来向数据库插入数据,并且忽略其中的重复键,避免出现IntegrityError。
阅读更多:MySQL 教程
MySQL Sqlalchemy的add_all()函数
add_all()函数是MySQL Sqlalchemy中用于向数据库一次性插入多行数据的函数。使用该函数,可以将数据以列表的形式传入,如下所示:
data = [
{"name": "Tom", "age": 18},
{"name": "Jerry", "age": 22},
{"name": "Mickey", "age": 25},
]
session.add_all([Student(name=item["name"], age=item["age"]) for item in data])
session.commit()
在以上例子中,我们将每个字典中的”name”和”age”字段插入到了Student表中。
忽略重复键的插入
在SQLAlchemy中,如果我们对一个已存在的索引列插入重复的值,那么会抛出IntegrityError异常,这显然不是我们想要的行为。
为了避免出现IntegrityError异常,我们可以使用add_all()中的on_duplicate_key_update子句来执行插入操作,并在冲突时更新已存在的记录。如下所示:
from sqlalchemy.dialects.mysql import insert
data = [
{"name": "Tom", "age": 18},
{"name": "Jerry", "age": 22},
{"name": "Mickey", "age": 25},
]
stmt = insert(Student).values(data)
stmt = stmt.on_duplicate_key_update(name=stmt.inserted.name, age=stmt.inserted.age)
session.execute(stmt)
session.commit()
在以上例子中,我们使用insert()创建了一个插入语句,并使用on_duplicate_key_update()指定了在出现冲突时的处理方式。具体来说,我们将name和age列更新为插入语句中的值,即使用了stmt.inserted.name和stmt.inserted.age。
完整示例代码
下面是一个完整的示例代码,演示了如何使用add_all()函数对数据进行插入,如何使用on_duplicate_key_update()子句来处理冲突。本例使用了python3.6和SQLAlchemy 1.3.3:
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.dialects.mysql import insert
Base = declarative_base()
class Student(Base):
__tablename__ = 'students'
id = Column(Integer, primary_key=True)
name = Column(String(32), index=True)
age = Column(Integer)
def __repr__(self):
return "<Student(name='%s', age='%s')>" % (self.name, self.age)
engine = create_engine('mysql+pymysql://user:passwd@localhost/db', echo=True)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
data = [
{"name": "Tom", "age": 18},
{"name": "Jerry", "age": 22},
{"name": "Mickey", "age": 25},
]
# 使用add_all()插入数据
session.add_all([Student(name=item["name"], age=item["age"]) for item in data])
session.commit()
# 使用insert()和on_duplicate_key_update()处理重复键
stmt = insert(Student).values(data)
stmt = stmt.on_duplicate_key_update(name=stmt.inserted.name, age=stmt.inserted.age)
session.execute(stmt)
session.commit()
# 查询数据并输出结果
results = session.query(Student).all()
print(results)
总结
本文主要介绍了如何使用MySQL Sqlalchemy的add_all()函数来向数据库一次插入多行数据,并且如何使用on_duplicate_key_update()子句来忽略重复键。在实际应用中,我们通常需要插入大量数据,这时使用add_all()可以提升插入效率。而使用on_duplicate_key_update()则可以避免插入过程中的IntegrityError异常,保障了数据写入的完整性和正确性,可以有效增强应用的稳定性。因此,掌握add_all()函数和on_duplicate_key_update()子句的使用方法,对于开发高效稳定的数据库应用是非常有帮助的。