如何在 SQLAlchemy 模型中获取列和值字典?
How to get column and values dictionary in SQLAlchemy model?
我有以下 table:
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))
是否有可能得到一个字典,对于空记录 return 类似于:
{'id': None, 'username': None, 'email': None}
如果我这样做:
user = User()
user.username = "testuser"
user.email = "test@example.com"
我希望能够得到对应值的字典。当然,如果我保存记录,我希望它也有 id
。
你可以利用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)
还有其他选项:
- Convert sqlalchemy row object to python dict
在大多数情况下,列名适合他们。
但也许你写的代码如下:
class UserModel(BaseModel):
user_id = Column("user_id", INT, primary_key=True)
email = Column("user_email", STRING)
column.name "user_email" 而字段名称是 "email",
column.name 无法像以前那样正常工作。
还有一个技巧是使用Python元类,示例代码:
您可以使用以下方法,该方法受 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()}")
现在你所要做的就是传递模型和相同模型的行来获取数据的字典表示。
我有以下 table:
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))
是否有可能得到一个字典,对于空记录 return 类似于:
{'id': None, 'username': None, 'email': None}
如果我这样做:
user = User()
user.username = "testuser"
user.email = "test@example.com"
我希望能够得到对应值的字典。当然,如果我保存记录,我希望它也有 id
。
你可以利用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)
还有其他选项:
- Convert sqlalchemy row object to python dict
在大多数情况下,列名适合他们。 但也许你写的代码如下:
class UserModel(BaseModel):
user_id = Column("user_id", INT, primary_key=True)
email = Column("user_email", STRING)
column.name "user_email" 而字段名称是 "email", column.name 无法像以前那样正常工作。
还有一个技巧是使用Python元类,示例代码:
您可以使用以下方法,该方法受 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()}")
现在你所要做的就是传递模型和相同模型的行来获取数据的字典表示。