.filter()
连用(推荐)and_
明确表达多个条件or_
进行“或”查询and_
与 or_
text()
执行自定义 SQL(完全手写 SQL)
select()
+ Core 语法构建 SQL在 SQLAlchemy 的 ORM 模式中,增删改查(CRUD) 是通过 ORM 映射的类(通常称为“模型类”)和 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()
|
如果你在使用 FastAPI,我可以进一步演示如何结合依赖注入把这些 CRUD 操作集成到路由中。需要的话可以继续问。
在 SQLAlchemy ORM 中,多条件查询可以通过 .filter()
方法,结合 and_()
、or_()
或多个 .filter()
链式调用来实现。
下面是一些常用的多条件查询方式示例。
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
name = Column(String)
email = Column(String)
age = Column(Integer)
.filter()
连用(推荐)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';
and_
与 or_
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()
查询类型 | 方法 |
---|---|
AND | .filter(a).filter(b) 或 and_(a, b) |
OR | or_(a, b) |
多条件组合 | filter(and_(...), or_(...)) |
动态拼接条件 | filter(*conditions) |
在 SQLAlchemy Core 模式下,你可以使用 text()
或者 select()
/ insert()
/ update()
/ delete()
等构建块,来执行 自定义 SQL 语句。
text()
执行自定义 SQL(完全手写 SQL)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)
select()
+ Core 语法构建 SQLfrom 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}))
操作 | 使用方式 |
---|---|
查询 | select() or text("SELECT...") |
插入 | insert() |
更新 | update() |
删除 | delete() |
原生SQL | text() |