我有一个定义如下的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中是否有一种方法可以创建计算列,以便像其他普通列一样方便地使用它,只要引用{{1},SQLAlchemy就会自动将其转换为(user.c.first_name + user.c.last_name).label('full_name')
}
user.c.full_name
我搜索并使用column_property或hybrid_property在SQLAlchemy ORM中找到了一些解决方案。我的情况不同之处在于,我只能使用 SQLAlchemy Core 。
答案 0 :(得分:1)
不可能在sqlalchemy核心中创建计算列。但是,您不需要这样做,所需要做的就是将表达式保存在变量中,然后在select语句中使用它。如果您要存储许多存储空间,则可以通过将它们全部存储在集合中来命名它们的名称。在下面的示例中,我为此目的使用了一个SQLAlchemy属性对象,因此它的行为与列集合类似。
class Table(sqlalchemy.Table):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.d = sqlalchemy.util._collections.Properties({})
user = Table('user', MetaData(),
Column('id', Integer),
Column('first_name', String),
Column('last_name', String))
user.d.full_name = (user.c.first_name + user.c.last_name).label('full_name')
user.d.backwards_name = (user.c.last_name + user.c.first_name).label('backwards_name')
sql = (select([
user.c.id,
user.d.full_name
]).where(user.c.id == 123))