SQLAlchemy 为大表定义 __repr__ 的最佳方法
SQLAlchemy best way to define __repr__ for large tables
我在 SQLAlchemy 中有一堆表要定义 __repr__
。
标准约定似乎是这样的:
def __repr__(self):
return "<TableName(id='%s')>" % self.id
这对小桌子来说都很好。但是,我有 40 多列的表。 是否有更好的构造 __repr__
的方法,这样我就不会手动输入大量字符串?
我的包含所有表格的文件名为 models.py
。我想到的一个解决方案是在 models.py
中创建一个方法 _create_repr_string
,负责自动生成 __repr__
到 return 的字符串。我想知道是否有更标准的方法来创建 __repr__
.
在浏览日志文件和堆栈跟踪时,对复杂对象具有良好的 __repr__
非常有用,因此您尝试为它想出一个好的模式真是太好了。
我喜欢有一个默认的小帮手(在我的例子中,初始化 flask-sqlalchemy
时 BaseModel 被设置为 model_class
)。
import typing
import sqlalchemy as sa
class BaseModel(Model):
def __repr__(self) -> str:
return self._repr(id=self.id)
def _repr(self, **fields: typing.Dict[str, typing.Any]) -> str:
'''
Helper for __repr__
'''
field_strings = []
at_least_one_attached_attribute = False
for key, field in fields.items():
try:
field_strings.append(f'{key}={field!r}')
except sa.orm.exc.DetachedInstanceError:
field_strings.append(f'{key}=DetachedInstanceError')
else:
at_least_one_attached_attribute = True
if at_least_one_attached_attribute:
return f"<{self.__class__.__name__}({','.join(field_strings)})>"
return f"<{self.__class__.__name__} {id(self)}>"
现在您可以让您的 __repr__
方法保持整洁:
class MyModel(db.Model):
def __repr__(self):
# easy to override, and it'll honor __repr__ in foreign relationships
return self._repr(id=self.id,
user=self.user,
blah=self.blah)
应该产生如下内容:
<MyModel(id=1829,user=<User(id=21, email='foo@bar.com')>,blah='hi')>
我在 SQLAlchemy 中有一堆表要定义 __repr__
。
标准约定似乎是这样的:
def __repr__(self):
return "<TableName(id='%s')>" % self.id
这对小桌子来说都很好。但是,我有 40 多列的表。 是否有更好的构造 __repr__
的方法,这样我就不会手动输入大量字符串?
我的包含所有表格的文件名为 models.py
。我想到的一个解决方案是在 models.py
中创建一个方法 _create_repr_string
,负责自动生成 __repr__
到 return 的字符串。我想知道是否有更标准的方法来创建 __repr__
.
在浏览日志文件和堆栈跟踪时,对复杂对象具有良好的 __repr__
非常有用,因此您尝试为它想出一个好的模式真是太好了。
我喜欢有一个默认的小帮手(在我的例子中,初始化 flask-sqlalchemy
时 BaseModel 被设置为 model_class
)。
import typing
import sqlalchemy as sa
class BaseModel(Model):
def __repr__(self) -> str:
return self._repr(id=self.id)
def _repr(self, **fields: typing.Dict[str, typing.Any]) -> str:
'''
Helper for __repr__
'''
field_strings = []
at_least_one_attached_attribute = False
for key, field in fields.items():
try:
field_strings.append(f'{key}={field!r}')
except sa.orm.exc.DetachedInstanceError:
field_strings.append(f'{key}=DetachedInstanceError')
else:
at_least_one_attached_attribute = True
if at_least_one_attached_attribute:
return f"<{self.__class__.__name__}({','.join(field_strings)})>"
return f"<{self.__class__.__name__} {id(self)}>"
现在您可以让您的 __repr__
方法保持整洁:
class MyModel(db.Model):
def __repr__(self):
# easy to override, and it'll honor __repr__ in foreign relationships
return self._repr(id=self.id,
user=self.user,
blah=self.blah)
应该产生如下内容:
<MyModel(id=1829,user=<User(id=21, email='foo@bar.com')>,blah='hi')>