在使用 SQLAlchemy 进行数据库查询时,字段名的指定有以下特殊之处和注意事项:
SQLAlchemy 使用的是模型类中定义的属性名,而非数据库中的实际列名:
# 假设数据库列名为 user_name,但模型属性为 username
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
username = Column('user_name', String) # 数据库列名为user_name
# 查询时应使用模型属性名username,而非数据库列名user_name
session.query(User.username).all()
如果字段名是 SQL 关键字(如 order
, group
等),需要特别处理:
from sqlalchemy import Column, Integer, String
from sqlalchemy.sql import quoted_name
class MyClass(Base):
__tablename__ = 'mytable'
id = Column(Integer, primary_key=True)
order = Column(quoted_name('order', True), String) # 处理关键字冲突
from sqlalchemy import func
# 给查询结果字段起别名
session.query(func.count(User.id).label('user_count')).all()
可以使用 getattr()
动态引用字段:
field_name = 'username'
query = session.query(getattr(User, field_name))
当需要直接使用数据库列名时:
from sqlalchemy import text
session.query(User).filter(text("user_name = 'john'")).all()
在多表关联查询中,需要明确指定表名前缀:
session.query(User.username, Address.email).join(Address).all()
label()
提高查询结果的可读性理解这些特性可以帮助你编写更清晰、更健壮的 SQLAlchemy 查询代码。