首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLAlchemy hybrid_property和表达式

SQLAlchemy hybrid_property和表达式
EN

Stack Overflow用户
提问于 2013-11-14 06:03:46
回答 1查看 5.6K关注 0票数 5

我正在使用sqlalchemy在postgres数据库中存储一些由外部进程产生的数据。外部数据有几个存储为字符串的日期,我希望将它们用作datetime对象进行比较和持续时间计算,并且希望在数据模型中进行转换以保持一致性。我正在尝试使用hybrid_property,但由于SQLAlchemy将hybrid_property用作实例或类的不同方式,我遇到了一些问题。

一个(简化的)案例看起来像这样...

代码语言:javascript
复制
class Contact(Base):
    id = Column(String(100), primary_key=True)
    status_date = Column(String(100))

    @hybrid_property
    def real_status_date(self):
        return convert_from_outside_date(self.status_date)

使用如下的转换函数(该函数可以返回一个日期,如果转换失败则返回False,或者在传递None时返回None)...

代码语言:javascript
复制
def convert_from_outside_date(in_str):
    out_date = None

    if in_str != None:
        try:
            out_date = datetime.datetime.strptime(in_str,"%Y-%m-%d")
        except ValueError:
            out_date = False
    return out_date

当我使用Contact的实例时,contact.real_status_date可以作为datetime正常工作。问题是在查询筛选器中使用Contact.real_status_date时。

代码语言:javascript
复制
db_session.query(Contact).filter(
    Contact.real_status_date > datetime.datetime.now())

获取"TypeError:此子句的布尔值未定义“异常,其中

代码语言:javascript
复制
in_str != None

作为堆栈跟踪的最后一部分的转换函数行。

一些答案(https://stackoverflow.com/a/14504695/416308)显示了如何使用设置器函数以及如何在数据模型中添加新列。其他答案(https://stackoverflow.com/a/13642708/416308)显示了添加的@property.expression函数,该函数将sqlalchemy可以解释为sql表达式的内容返回给sql表达式。

向Contact类添加setter是可行的,但是添加新列似乎不是必需的,而且会使一些表元数据的解析变得更加困难,如果可以的话,我希望避免这种情况。

代码语言:javascript
复制
_real_status_date = Column(DateTime())

@hybrid_property
def real_status_date(self):
    return self._real_status_date

@real_status_date.setter
def value(self):
    self._real_status_date = convert_from_outside_date(self.status_date)

如果我使用的是@.expression装饰器,我需要实现一个更兼容sql的strptime函数吗?那会是什么样子呢?是不是转换函数有问题,导致了这里的问题?

EN

回答 1

Stack Overflow用户

发布于 2014-02-19 11:16:57

正如zzzeek提到的,您可以将以下内容添加到类中

根据您的DB,它可能已经解释了python datetime对象

因此它只能将您的转换函数修改为:

代码语言:javascript
复制
def convert_from_outside_date(in_str):
if in_str:
    try:
        return datetime.datetime.strptime(in_str,"%Y-%m-%d")
# Return None for a Null date
return None

否则,您需要添加表达式函数:

代码语言:javascript
复制
@real_status_date.expression
def real_status_date(self):
    return sqlalchemy.Date(self.real_status_date)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19965327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档