gpt4 book ai didi

python - SQLAlchemy,如何将混合表达式设置为 'understand' 日期时间?

转载 作者:行者123 更新时间:2023-12-05 04:40:21 24 4
gpt4 key购买 nike

我正在尝试为 Person 的声明映射类设置一个 SQLAlchemy 混合属性,该类有一个名为 birth_dateDateTime 字段表示此人的出生日期。

我想设置一个代表人的年龄的@hybrid_property,如下所示:

class Person(Base):
__tablename__ = 'person'
name: str = Column(String)
date_of_birth: DateTime = Column(DateTime)

#works fine after the objects are loaded
@hybrid_property
def age(self):
today = date.today()
if self.date_of_birth:
return today.year - self.date_of_birth.year - (
(today.month, today.day) < (self.date_of_birth.month, self.date_of_birth.day))

@age.expression
def age(cls): #Don't know how to set this up
pass

我在为混合属性设置 expression 时遇到问题。据我所知,该表达式应该返回一个 SQL 语句,这将有助于过滤/查询数据库中的老人年龄。

为此,以下 SQL 有效

SELECT (strftime('%Y', 'now') - strftime('%Y', person.date_of_birth)) - (strftime('%m-%d', 'now') < strftime('%m-%d', person.date_of_birth)) as age from person

但我不知道如何“告诉”表达式使用此 SQL(或者即使它是解决此问题的正确方法。)我尝试使用 text像这样:

@age.expression
def age(cls):
current_time = datetime.utcnow()
return text(f"{current_time.year} - strftime('%Y', '{cls.date_of_birth}')")

但是没有用。我不知道如何告诉表达式将 SQL 语句用作虚拟列的选择。 (那将是年龄列)

目标是能够过滤和查询 age 属性,如下所示:

session.query(Person).filter(Person.age > 25)

请提供帮助。

最佳答案

混合属性的这一部分需要返回一个可执行的 SQLAlchemy 子句。由于 Postgres 已经有一个合适的函数,你可以直接使用它:

import sqlalchemy as sa

@age.expression
def age(cls):
return sa.func.age(cls.date_of_birth)

函数:docs , 寻找 age(timestamp)

或在MySQL :

@age.expression
def age(cls):
return sa.func.timestampdiff('year', cls.date_of_birth, sa.func.curdate())

或者在 SQLite 中:

@age.expression
def age(cls):
strftime = sa.func.strftime

year_diff = strftime('%Y', 'now') - strftime('%Y', cls.date_of_birth)
# If the month and date of the current year are before the
# month and date of birth, then we need to subtract one year
# because the "birthday" hasn't happened yet.
is_partial_year = strftime('%m-%d', 'now') < strftime('%m-%d', cls.date_of_birth)

return year_diff - is_partial_year

关于python - SQLAlchemy,如何将混合表达式设置为 'understand' 日期时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70305321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com