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
相关产品推荐
相关产品推荐

