SQLAlchemy 如何实现批量插入,如果存在指定属性,则更新其他属性
时间: 2023-05-23 17:05:48 浏览: 1016
A: SQLAlchemy 可以使用 `Insert` 和 `Update` 语句来实现批量插入和更新。具体地,可以使用以下方式来实现:
1. 对于批量插入,可以使用 `insert()` 方法和 `values()` 方法,如下所示:
```
from sqlalchemy import create_engine, insert
# 创建数据库连接
engine = create_engine('mysql+pymysql://user:password@localhost/test_db')
# 构造数据
data = [
{'id': 1, 'name': 'Alice', 'age': 20},
{'id': 2, 'name': 'Bob', 'age': 22},
{'id': 3, 'name': 'Charlie', 'age': 25}
]
# 定义表对象和元数据
metadata = MetaData()
user_table = Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('age', Integer))
# 插入数据
stmt = insert(user_table).values(data)
conn = engine.connect()
conn.execute(stmt)
conn.close()
```
2. 对于更新,可以使用 `update()` 方法和 `where()` 方法,如下所示:
```
from sqlalchemy import create_engine, update
# 创建数据库连接
engine = create_engine('mysql+pymysql://user:password@localhost/test_db')
# 定义表对象和元数据
metadata = MetaData()
user_table = Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('age', Integer))
# 更新
stmt = update(user_table).where(user_table.c.id == 1)\
.values(name='Alice', age=21)
conn = engine.connect()
conn.execute(stmt)
conn.close()
```
3. 对于**存在指定属性,则更新其他属性**的情况,可以使用 `on_duplicate_key_update()` 方法(需要 MySQL 5.5.3 或以上版本),如下所示:
```
from sqlalchemy.dialects.mysql import insert
# 创建数据库连接
engine = create_engine('mysql+pymysql://user:password@localhost/test_db')
# 构造数据
data = [
{'id': 1, 'name': 'Alice', 'age': 20},
{'id': 2, 'name': 'Bob', 'age': 22},
{'id': 3, 'name': 'Charlie', 'age': 25}
]
# 定义表对象和元数据
metadata = MetaData()
user_table = Table('user', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('age', Integer))
# 插入或更新数据
stmt = insert(user_table).values(data)\
.on_duplicate_key_update(name=inserted.name, age=inserted.age)
conn = engine.connect()
conn.execute(stmt)
conn.close()
```
其中,`inserted` 是指 `VALUES` 子句中插入的值,可以将它看做一个占位符,使用 `on_duplicate_key_update()` 方法将更新指定属性。
阅读全文