gpt4 book ai didi

python - SA : can I have a 'year' column_property for a Date column?

转载 作者:行者123 更新时间:2023-11-28 22:05:17 24 4
gpt4 key购买 nike

我在 sqlalchemy-0.7 中有一个带有日期列的类。我可以要一个 column_property 吗?或任何类似的东西让我很容易通过它过滤?怎么写呢?

IE,我想要(声明性语法):

class Foo(Base):
id = Column(Integer, primary_key=True)
date = Column(Date(), nullable=False)
year = column_property(something here)

# later on
q = session().query(Foo).filter_by(year=2011)

最佳答案

当然你可以定义这样的属性:

year = column_property(extract('year', date))

但你真的需要它吗?您可以通过重写过滤条件来定义没有此类属性的年份过滤:

query(Foo).filter(extract('year', Foo.date)==2011)

更新

虽然这个解决方案看起来很简单,但它也有一个缺点:WHERE 子句中的这种条件永远不会在日期字段上使用索引。有很多行和条件的高选择性,这将对性能产生很大影响。因此,您可能希望重写导致 RANGE INDEX SCAN 而不是 FULL TABLE SCAN 的条件(如 Simon 的评论中所建议):

start = datetime.date(year, 1, 1)
end = datetime.date(year, 12, 31)
query(Foo).filter(Foo.date.between(start, end))

定义具有这种行为的属性也是可能的,你只需要重新定义比较器:

class YearComparator(ColumnProperty.Comparator):
def __eq__(self, year):
if isinstance(year, int):
column = self.prop.columns[0].get_children()[0].expr
start = datetime.date(year, 1, 1)
end = datetime.date(year, 12, 31)
return column.between(start, end)
else:
# It can be a column or exression which we can't handle such way
return ColumnProperty.Comparator.__eq__(self, year)
# __lt__, __gt__ etc. are very similar to __eq__

def year_property(date_column, **kwargs):
kwargs.setdefault('comparator_factory', YearComparator)
return column_property(extract('year', date_column), **kwargs)

class Foo(Base):
__tablename__ = 'Foo'
id = Column(Integer, primary_key=True)
date = Column(Date, index=True)
year = year_property(date)

关于python - SA : can I have a 'year' column_property for a Date column?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5545245/

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