【问题标题】:How to get column and values dictionary in SQLAlchemy model?如何在 SQLAlchemy 模型中获取列和值字典?
【发布时间】:2015-04-29 01:08:21
【问题描述】:

我有下表:

Base = declarative_base()
metadata = Base.metadata

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String(255))
    email = Column(String(255))

是否有可能获得一个字典,对于空记录将返回如下内容:

{'id': None, 'username': None, 'email': None}

如果我这样做:

user = User()
user.username = "testuser"
user.email = "test@example.com"

我希望能够获得具有相应值的字典。当然,如果我保存记录,我希望它也有id

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    您可以使用user.__table__.columns:

    def get_model_dict(model):
        return dict((column.name, getattr(model, column.name)) 
                    for column in model.__table__.columns)
    

    用法:

    user = User()
    get_model_dict(user)
    

    还有其他选择:

    【讨论】:

      【解决方案2】:

      在大多数情况下,列名适合他们。 但也许你写的代码如下:

      class UserModel(BaseModel):
          user_id = Column("user_id", INT, primary_key=True)
          email = Column("user_email", STRING)
      

      字段名称为“email”时的 column.name “user_email”, column.name 无法像以前那样正常工作。

      使用 Python 元类还有一个技巧,示例代码:

      sqlalchemy_base_model.py

      【讨论】:

        【解决方案3】:

        您可以使用受alecxe 给出的答案启发的以下方法。

        def get_model_dict(model, row):
            if isinstance(row, model):
                columns = [x.name for x in list(model.__table__.columns)]
                return {x: getattr(row, x) for x in columns}
            else:
                raise ValueError(f"The provided row is not of type {model.__table__.name.title()}")
        

        现在您所要做的就是传递模型和相同模型的行来获取数据的字典表示。

        【讨论】:

          猜你喜欢
          • 2018-04-14
          • 2016-12-10
          • 1970-01-01
          • 2021-11-02
          • 2014-09-17
          • 1970-01-01
          • 2012-05-21
          • 2020-04-04
          • 2013-08-22
          相关资源
          最近更新 更多