在 SQLAlchemy 的 ORM 模式中,增删改查(CRUD) 是通过 ORM 映射的类(通常称为“模型类”)和 Session 对象来完成的。
Session
下面是一个完整的增删改查(Create, Read, Update, Delete)操作的使用示例:
假设你已经定义了如下模型和数据库连接:
# db.py from sqlalchemy import create_engine from sqlalchemy.orm import declarative_base, sessionmaker DATABASE_URL = "sqlite:///./test.db" # 示例用 SQLite engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False}) SessionLocal = sessionmaker(bind=engine, autoflush=False, autocommit=False) Base = declarative_base()
# models.py from sqlalchemy import Column, Integer, String from db import Base class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) name = Column(String, index=True) email = Column(String, unique=True, index=True)
# main.py from db import engine from models import Base Base.metadata.create_all(bind=engine)
from db import SessionLocal from models import User
def create_user(name: str, email: str): db = SessionLocal() try: new_user = User(name=name, email=email) db.add(new_user) db.commit() db.refresh(new_user) # 刷新以获取 ID 等信息 return new_user finally: db.close()
def get_user_by_id(user_id: int): db = SessionLocal() try: return db.query(User).filter(User.id == user_id).first() finally: db.close() def get_all_users(): db = SessionLocal() try: return db.query(User).all() finally: db.close()
def update_user(user_id: int, new_name: str): db = SessionLocal() try: user = db.query(User).filter(User.id == user_id).first() if user: user.name = new_name db.commit() db.refresh(user) return user finally: db.close()
def delete_user(user_id: int): db = SessionLocal() try: user = db.query(User).filter(User.id == user_id).first() if user: db.delete(user) db.commit() return user finally: db.close()
| 操作 | 方法 || -- | ---------------------------------------- || 增 | db.add() → db.commit() || 查 | db.query().filter().first() 或 .all() || 改 | 修改字段 → db.commit() → db.refresh() || 删 | db.delete() → db.commit() |
db.add()
db.commit()
db.query().filter().first()
.all()
db.refresh()
db.delete()
如果你在使用 FastAPI,我可以进一步演示如何结合依赖注入把这些 CRUD 操作集成到路由中。需要的话可以继续问。
在 SQLAlchemy ORM 中,多条件查询可以通过 .filter() 方法,结合 and_()、or_() 或多个 .filter() 链式调用来实现。
.filter()
and_()
or_()
下面是一些常用的多条件查询方式示例。
class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) name = Column(String) email = Column(String) age = Column(Integer)
user = db.query(User).filter(User.name == "Alice").filter(User.age > 20).all()
等价于 SQL:
SELECT * FROM users WHERE name = 'Alice' AND age > 20;
and_
from sqlalchemy import and_ user = db.query(User).filter(and_(User.name == "Alice", User.age > 20)).all()
or_
from sqlalchemy import or_ user = db.query(User).filter(or_(User.name == "Alice", User.name == "Bob")).all()
等价于:
SELECT * FROM users WHERE name = 'Alice' OR name = 'Bob';
from sqlalchemy import and_, or_ user = db.query(User).filter( and_( User.age > 18, or_(User.name == "Alice", User.name == "Bob") ) ).all()
SQL:
SELECT * FROM users WHERE age > 18 AND (name = 'Alice' OR name = 'Bob');
conditions = [] if name: conditions.append(User.name == name) if min_age: conditions.append(User.age >= min_age) user = db.query(User).filter(*conditions).all()
.filter(a).filter(b)
and_(a, b)
or_(a, b)
filter(and_(...), or_(...))
filter(*conditions)
在 SQLAlchemy Core 模式下,你可以使用 text() 或者 select() / insert() / update() / delete() 等构建块,来执行 自定义 SQL 语句。
text()
select()
insert()
update()
delete()
from sqlalchemy import text from config.db import engine with engine.connect() as conn: result = conn.execute(text("SELECT * FROM users WHERE age > :age"), {"age": 18}) rows = result.fetchall() for row in rows: print(row)
from sqlalchemy import select from models.core_model import users # 假设 core 中定义了 Table: users from config.db import engine with engine.connect() as conn: stmt = select(users).where(users.c.age > 18) result = conn.execute(stmt) for row in result.fetchall(): print(row)
from sqlalchemy import insert stmt = insert(users).values(name="Alice", age=22) with engine.connect() as conn: conn.execute(stmt) conn.commit()
from sqlalchemy import update stmt = update(users).where(users.c.id == 1).values(name="UpdatedName") with engine.connect() as conn: conn.execute(stmt) conn.commit()
from sqlalchemy import delete stmt = delete(users).where(users.c.id == 1) with engine.connect() as conn: conn.execute(stmt) conn.commit()
print(stmt.compile(compile_kwargs={"literal_binds": True}))
text("SELECT...")