【问题标题】:Can SQL Alchemy and Pyramid handle a date effective scenarioSQL Alchemy 和 Pyramid 可以处理日期有效的场景吗
【发布时间】:2014-04-28 04:52:52
【问题描述】:

我正在寻找可以处理以下场景的 Web 框架(希望基于 Python、Postgresql 和 ORM):

你有一个 Person 表(有一个人 Avril Lavigne - 有过两次婚姻):

PersonID Start       End         PersonName
-------- ----------- ----------- -------------
1        27-Sep-1984 14-Jul-2006 Avril Lavigne
1        15-Jul-2006 30-Jun-2013 Avril Whibley
1        01-Jul-2013 31-Dec-9999 Avril Kroeger

您有一个分配表(这是一个人持有的工作分配等,一个人可以在不同的位置持有多个):

AssignID Start       End         PersonID JobID LocID
-------- ----------- ----------- -------- ----- -----
1        27-Sep-1984 26-Sep-1999 1        1     1 
1        27-Sep-1999 31-Dec-2002 1        1     2
1        01-Jan-2003 31-Dec-9999 1        1     3
2        01-Jul-2013 31-Dec-9999 1        2     3

有没有一种方法可以让 Pyramid 让用户选择一个生效日期(比如今天),SQL Alchemy 将能够使用生效日期和 SQL between 以及 @ 上的外键连接来连接表987654324@;带回来:

Avril Kroeger 有 2 个作业,JobID 1 和 2 以及 LocID 3。

Oracle 中 SQL 语句的位置:

select p.PersonName, 
       a.JobID,
       a.LocID
from   Person p,
       Assignment a
where  a.PersonID = p.PersonID
and    trunc(sysdate) between a.Start and a.End
and    trunc(sysdate) between p.Start and p.End

我只是担心我要学习另一个无法处理复合主键的 Web 框架以及上述甚至 SQL 外键都无法处理的场景。

那么 ORM 基本上可以处理任意查询吗?如果您选择上述场景,您是否会丢失所有 ORM 速记功能?有没有更好的方法来处理上述情况。我应该将生效日期存储为会话变量吗?

我对该主题的了解不够,无法提供我的解决方案。我更想避免学习另一个无法解决上述情况的框架。

【问题讨论】:

    标签: python sqlalchemy pyramid


    【解决方案1】:

    首先,Pyramid 可以完全处理这种情况,因为 Pyramid 与存储无关,所以它对数据库、SQL 和其他类似的东西一无所知 :) 换句话说,这个问题与 Pyramid 没有任何关系.

    其次,SQLAlchemy 确实支持复合主键。在我看来,声明性类应该是这样的:

    class Person(sa.Base):
        person_id = sa.Column(sa.Integer, primary_key=True)
        start = sa.Column(sa.DateTime, primary_key=True)
        end = sa.Column(sa.DateTime, primary_key=True)
        name = sa.Column(sa.String)
    
    class Assignment(sa.Base):
        person_id = sa.Column(sa.Integer, primary_key=True)
        start = sa.Column(sa.DateTime, primary_key=True)
        end = sa.Column(sa.DateTime, primary_key=True)
        ...
    

    您的查询将如下所示:

    (session.query(Person.name, Assignment.jobId, Assignment.LocID)
        .filter(Assignment.person_id==Person.person_id)
        .filter(sa.sql.functions.now().between(Person.start, Person.end))
        .filter(sa.sql.functions.now().between(Assignment.start, Assignment.end))
    )
    

    【讨论】:

    • 你的答案不会在开始和结束之间使用 start=trunc(sysdate) 而不是 trunc(sysdate) 吗?
    • 好吧,我已经编辑了我的答案 - 完全未经测试,但这就是我将用作起点的内容。
    猜你喜欢
    • 2012-03-31
    • 2011-09-13
    • 1970-01-01
    • 2014-03-31
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2014-05-07
    相关资源
    最近更新 更多