我有一个SQLAlchemy表的定义如下:
user = Table('user', MetaData(),
Column('id', Integer),
Column('first_name', String),
Column('last_name', String))
在查询过程中,我经常需要引用用户的全名,例如:
sql = (select([
user.c.id,
(user.c.first_name + user.c.last_name).label('full_name')
]).where(user.c.id == 123))
由于full_name在许多地方都被使用,所以这种代码有很多副本。
我想知道在SQLAlchemy中是否有一种方法可以创建一个计算列,这样我就可以像其他普通列一样方便地使用它,SQLAlchemy会自动将其转换为(user.c.first_name + user.c.last_name).label('full_name')
,每当我引用user.c.full_name
时。
翻译结果:
由于full_name在许多地方都被使用,因此这段代码有很多副本。 我想知道在SQLAlchemy中是否有一种方法可以创建一个计算列,这样我就可以方便地像使用其他普通列一样使用它,当我引用user.c.full_name时,SQLAlchemy会自动将其转换为(user.c.first_name + user.c.last_name).label('full_name')。
sql = (select([
user.c.id,
user.c.full_name
]).where(user.c.id == 123))
我在搜索中发现了一些使用column_property或hybrid_property的SQLAlchemy ORM解决方案。而我这种情况只能使用SQLAlchemy Core。"Original Answer"翻译成"最初的回答"。
full_name
只是一个示例,实际上可以是任何单词。我的项目严重依赖于table.c
来进行许多与列相关的检查,所以根据您的建议,我可以将full_name
移动到table.c
中的ColumnCollection
实例中。但是我检查了源代码,发现ColumnCollection
只接受Column
实例。如果有一种方法可以绕过并将其注入到ColumnCollection
中,那对我来说是可接受的。 - undefinedself.d = Properties({})
更改为self.d = Properties(ChainMap({}, self.c._data))
,然后通过user.d
来访问所有内容。 - undefinedd
,所有原始的Table
功能都不会被破坏。 - undefined