如何在 SQL Alchemy 中仅将 Python 表达式用作混合属性

Posted

技术标签:

【中文标题】如何在 SQL Alchemy 中仅将 Python 表达式用作混合属性【英文标题】:How to use Python expression only as hybrid property in SQL Alchemy 【发布时间】:2019-09-17 08:02:32 【问题描述】:

我有一个 SQL Alchemy 映射:

class Employee(Base):
  __tablename__ = 'employee'

  id = Column(Integer, primary_key=True)
  first_name = Column(String)
  last_name = Column(String)

  @hybrid_property
  def me(self):
    return 'Yes!' if self.first_name == 'ritratt' else 'Nope...'

现在我只想进行如下查询: session.query(Employee.me).all()

但它不起作用,因为 SQL Alchemy 需要一个列或表达式而不是 str。解决方案是使用hybrid_expression,但我不想使用表达式。我希望我的映射只使用混合属性。

如何使用hybrid_property 编写一个返回str 的映射并使用query()

【问题讨论】:

【参考方案1】:

我找到了一种解决方法。我使用 Python 导出该值,然后将其包装在 castconcat 中:

from sqlalchemy import cast, String

...

@hybrid_property
  def me(self):
    value = 'Yes!' if self.first_name == 'ritratt' else 'Nope...'
    return cast(value, String) # or return concat('', value)

这看起来还是有点老套。想知道是否存在更好的方法

【讨论】:

在这种情况下确实发挥得很好!另一个问题是:我们可以使用 self.first_name 来映射一个值吗?所以我们可以返回 dict[self.first_name] 之类的东西 似乎 self.first_name 无法与字符串“ritratt”进行比较

以上是关于如何在 SQL Alchemy 中仅将 Python 表达式用作混合属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Latex 中仅将一位作者与其他三位作者居中对齐

如何在颤动的 5 个元素的列中仅将一个元素居中

在 ListView 中仅将标题设为粗体

在 Hive 中仅将时间转换为 unix 时间戳

在 C# 中仅将类型作为参数传递

在 std::string 中仅将数字转换为 int