MySQL Sqlalchemy add_all() 忽略重复键 IntegrityError

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()子句的使用方法,对于开发高效稳定的数据库应用是非常有帮助的。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程