如何在SQLAlchemy中实现类似MySQL的虚拟列查询?
在SQLAlchemy中实现自定义虚拟列查询
嘿,这事儿不难,我给你两种常用的实现方式,对应SQLAlchemy的Core和ORM两种使用场景,你可以根据自己的项目情况选:
方式一:使用SQLAlchemy Core
如果你用的是Core模式(直接操作表结构而非ORM模型),可以这样写:
首先确保你已经定义好cars表的元数据结构:
from sqlalchemy import create_engine, MetaData, Table, Column, String, literal, select # 初始化引擎和元数据 engine = create_engine('mysql+pymysql://你的用户名:密码@主机地址/数据库名') metadata = MetaData() # 定义cars表结构(如果已经映射过可以跳过这步) cars = Table( 'cars', metadata, Column('brand', String), Column('name', String) )
然后构造查询语句,用literal()生成固定值的虚拟列,再用label()指定列名:
# 构造查询 query = select( cars.c.brand, cars.c.name, literal("10").label("age") # 对应MySQL里的"10" as age ) # 执行查询并获取结果 with engine.connect() as conn: result = conn.execute(query) for row in result: print(row.brand, row.name, row.age)
方式二:使用SQLAlchemy ORM
如果你的项目用的是ORM模型(比如定义了Cars类),代码会更简洁:
先定义ORM模型:
from sqlalchemy import create_engine, Column, String, Integer, literal from sqlalchemy.orm import declarative_base, sessionmaker Base = declarative_base() class Cars(Base): __tablename__ = 'cars' id = Column(Integer, primary_key=True) # 假设表有主键id brand = Column(String) name = Column(String) # 初始化会话 engine = create_engine('mysql+pymysql://你的用户名:密码@主机地址/数据库名') Session = sessionmaker(bind=engine) session = Session()
然后直接在query()里指定虚拟列:
# 执行查询 result = session.query( Cars.brand, Cars.name, literal("10").label("age") ).all() # 遍历结果 for row in result: print(row.brand, row.name, row.age)
补充说明
- 如果你的虚拟列是数字类型(比如
10而非"10"),直接写literal(10).label("age")即可,SQLAlchemy会自动匹配对应的数据类型。 - 也可以用
text('"10"').label("age")替代literal(),但literal()是类型安全的,更推荐使用。
内容的提问来源于stack exchange,提问作者Houy Narun
相关产品推荐
相关产品推荐

