You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLAlchemy查询返回类实例但打印格式不符合预期的问题

问题:让SQLAlchemy模型实例以可读格式打印

我编写了如下SQLAlchemy代码:

from sqlalchemy import create_engine, Column, String,and_,insert,select,Integer,delete
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import sessionmaker

# Define your model
Base = declarative_base()

class MyTable(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    product = Column(String)
    market = Column(String)
    idea = Column(String)

# Create a connection to your database
engine = create_engine('postgresql+psycopg://postgres:2001@localhost:5432/postgres')
# MyTable.__table__.drop(engine)
Base.metadata.create_all(engine)

# Create a session
Session = sessionmaker(bind=engine)
session = Session()

session.execute(
    insert(MyTable),
    [
        {"id":1,"product":"BG","market":"JY","idea":"sad"},
        {"id":2,"product":"GF","market":"HN","idea":"happy"},
    ]
    )
session.commit()

results = session.scalars(select(MyTable).where(MyTable.id==1)).all()
print(results)

执行后得到的结果是:

[<__main__.MyTable object at 0x103818650>]

而我期望的打印结果为:

[MyTable(id=1,product='BG',market='JY',idea='sad')]

请问如何让SQLAlchemy返回的类实例以期望的格式打印?


解决方案

要实现这个需求,只需在MyTable类中重写__repr__方法即可。这个方法会在打印对象时被调用,用于自定义对象的字符串输出格式。

方法一:手动指定字段格式

修改后的MyTable类代码如下:

class MyTable(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    product = Column(String)
    market = Column(String)
    idea = Column(String)

    def __repr__(self):
        return f"MyTable(id={self.id},product='{self.product}',market='{self.market}',idea='{self.idea}')"

修改后再次执行代码,打印results就会输出你期望的格式。

方法二:动态适配所有字段

如果后续模型可能新增字段,可通过遍历模型的数据库字段动态生成__repr__内容,避免手动维护:

class MyTable(Base):
    __tablename__ = 'my_table'
    id = Column(Integer, primary_key=True)
    product = Column(String)
    market = Column(String)
    idea = Column(String)

    def __repr__(self):
        # 遍历模型所有数据库字段,拼接属性字符串
        attrs = ", ".join([f"{key}={repr(getattr(self, key))}" for key in self.__mapper__.columns.keys()])
        return f"{self.__class__.__name__}({attrs})"

这种方式会自动包含所有定义的数据库字段,后续新增字段无需修改__repr__方法。

内容的提问来源于stack exchange,提问作者moth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:22:18