在SQLAlchemy核心表中创建计算列

时间:2019-04-12 10:59:40

标签: python database orm sqlalchemy

我有一个定义如下的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

1 个答案:

答案 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))