Python中如何使用sqlalchemy的query取出对应实例属性

现在有这么一个场景,假设我有一个外部的对象 name,做过滤的时候可以是

query = query.filter(XXModel.name == name)

但是如果我想对 XXModel.name 这个属性做一些处理,例如我这么写:

query = query.filter(somefunc(XXModel.name, name))

这个时候就会出问题,提示“ object of type 'InstrumentedAttribute' has no len()” 那么我该如何处理才能把 XXModel.name 这个对象转换成一个字符串对象呢?


Python中如何使用sqlalchemy的query取出对应实例属性

4 回复

楼主可以看一下 Sqlachemy 的 Hybrid attribute 这部分文档
http://docs.sqlalchemy.org/en/latest/orm/extensions/hybrid.html


用SQLAlchemy的query取出实例属性,核心是理解查询返回的是模型实例,然后直接访问其属性就行。

假设有个User模型:

from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String)

# 创建引擎和会话
engine = create_engine('sqlite:///test.db')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

查询单个实例并取属性:

# 查询id为1的用户
user = session.query(User).filter_by(id=1).first()
if user:
    print(f"用户名: {user.name}, 邮箱: {user.email}")

查询多个实例:

# 查询所有用户
users = session.query(User).all()
for user in users:
    print(f"ID: {user.id}, 姓名: {user.name}")

只查询特定属性(返回元组):

# 只查询name和email列
results = session.query(User.name, User.email).all()
for name, email in results:
    print(f"姓名: {name}, 邮箱: {email}")

用with_entities指定返回属性:

from sqlalchemy.orm import load_only

# 只加载特定属性
users = session.query(User).options(load_only(User.name, User.email)).all()
for user in users:
    print(user.name)  # 可以访问
    # print(user.id)   # 如果访问未加载的属性会触发延迟加载

总结:查询后直接.属性名访问就行。

嗯,我看了,hybrid attribute 只能做到取到实例的内容,但是如果想把这个作为一个参数传出来就做不到了,毕竟 query 里面执行的本质上还是 sql 语句

想要真的取出来我能想到的也只有先 query.all()把 query 里的对象全都实例化,再去取对应属性

回到顶部