‹ 返回笔记 Esc·

SQLAlchemy 问题与修复

SQLAlchemy ORM 增删改查 --- SQLAlchemy 原生查询 1. 通过属性名访问: 假设 label 是数据库中的一个列名,你可以直接通过 Row 对象的属性来访问 2. 映射为字…

SQLAlchemy ORM 增删改查

1from sqlalchemy import and_
2from sqlalchemy.orm import Session
3from api.models.user import User
4from db.base import get_db
5
6@router.get("/crud")
7async def crud(db: Session = Depends(get_db)):
8    # 查询全部
9    users = db.query(User).all()
10    if users:
11        user_id = users[0].username
12        print(user_id)
13
14    # 查询过滤
15    username = "admin"
16    user = db.query(User).filter(and_(User.username == username)).first()
17    if user:
18        user_id = user.id
19        print(user_id)
20
21    # 新增
22    new_user = User(username='Zailiang', name="孙")
23    db.add(new_user)
24    db.commit()
25    db.refresh(new_user)
26    print(new_user)
27
28    # 删除
29    user = db.query(User).filter(and_(User.id == 3)).first()
30    db.delete(user)
31    db.commit()
32
33    # 修改
34    user = db.query(User).filter(and_(User.id == 13)).first()
35    user.name = "ZL"
36    user.username = "SUN"
37    db.commit()
38    db.refresh(user)

SQLAlchemy 原生查询

1async def search_article_by_id(request: Request, db: Session = Depends(get_db)):
2    """根据id查询文章"""
3    form = await request.form()
4    id = form.get('id')
5    info = db.execute(text("SELECT * FROM t_article_info WHERE id = :id"), {"id": id})
6    # 使用属性访问
7    one = info.fetchone()
8    article_title = one.article_title
9    # 使用索引访问
10    one = info.mappings().fetchone()
11    pk = one['pk']
  1. 通过属性名访问:

假设 label 是数据库中的一个列名,你可以直接通过 Row 对象的属性来访问

  1. 映射为字典风格访问:

如果你更喜欢字典风格的访问方式,你可以通过 SQLAlchemy 的 Result 对象调用 .mappings() 方法,将行结果映射为字典对象。这将允许你使用 one['label'] 的方式访问字段值。


异步 SQL 查询

1@router.get("/users")
2async def get_users(db: AsyncSession = Depends(get_db)):
3    # orm 查询单个
4    stmt = select(User).filter(User.id == 1)
5    execute_result = await db.execute(stmt)
6    user = execute_result.scalars().first()
7    print(user.username)
8    # orm 查询多个
9    stmt = select(User)
10    execute_result = await db.execute(stmt)
11    users = execute_result.scalars().all()
12    for user in users:
13        print(user.username)
14    # 原生查询
15    execute = await db.execute(text("SELECT * FROM user"))
16    fetchall = execute.fetchall()
17    print(fetchall)

SQLAlchemy 结果用字段名称获取

1from sqlalchemy import text
2
3sql = text("SELECT text, tokens FROM milvus_case_tokens")
4info = await db.execute(sql)
5# 使用 mappings() 将每一行转换为 dict-like 对象
6rows = info.mappings().all()
7for row in rows:
8    print(row["tokens"])  # 使用字段名访问
  • mappings() 方法会将每一行转换成一个字典格式(RowMapping 对象),你就可以通过字段名来访问数据了