V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hanssx
V2EX  ›  Flask

sqlalchemy 中 column 类型为 list 的情况

  •  
  •   hanssx · 2019-06-24 10:34:26 +08:00 · 5008 次点击
    这是一个创建于 1978 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现有一个需求,table 中某 column (假定为 col_a )有多个顺序递增的日期(不确定列表中到底有多少个日期,所以不能固定的构造 N 个字段来存),我可以把 col_a 的类型设置成 string 或者 pickle (这个存储类型不重要)。

    在构造查询条件的时候,会传入一个 begin_time 和 end_time,查询 col_a 中是否有某个时间在 begin_time 和 end_time 之间,如果有,条件成立,否则条件不成立。

    正常来说,如果 col_a 是一个日期,sqlalchemy 中用 between 就可以了,但是现在 col_a 是一个有多个递增日期的列表,原生 sql 我都想不出来怎么写,sqlalchemy 是不是也没法直接写出来。

    目前能想到的就是先取出所有 table 的记录,遍历一遍 col_a 列,把所有满足条件的记录存储成一个临时表,然后在临时表的基础上再构造其他查询条件。

    还有其他方案吗?(感觉这个有点蛋疼,我愿意为知识付费 20 元。

    7 条回复    2019-06-24 23:13:36 +08:00
    myyou
        1
    myyou  
       2019-06-24 11:33:31 +08:00
    把日期单独开一个表存储,然后连接查询一下不行吗?
    hanssx
        2
    hanssx  
    OP
       2019-06-24 11:55:28 +08:00
    @myyou 好像也只能这样了,在 flask 群里有 2 个哥们给了 2 种答案,
    一种就是你这种,再弄一个表
    另外一种是使用 mysql 的 json 函数,但是我搜索发现 json_search 好像只能匹配,无法比较。
    要是还没有其他方案的话,只能这样了,到时候我给你转 5 块钱以表诚意,因为群里的哥们先说的。。。抱歉。
    我的 QQ:9614 六 2392
    myyou
        3
    myyou  
       2019-06-24 12:02:51 +08:00   ❤️ 1
    @hanssx 不用转账,随手一答,不一定是最好的解决办法。
    jybox
        4
    jybox  
       2019-06-24 15:56:59 +08:00
    添加两个 column 分别来存列表里最小的日期和最大的日期,这样不就可以比较了
    hanssx
        5
    hanssx  
    OP
       2019-06-24 18:49:37 +08:00
    @jybox 我刚一开始的时候和你的想法一样,后来我发现有问题,举个例子,
    简化假设 begin_time 和 end_time 是 5 7,那么给你 2 个序列
    [3,6,9]
    [3,8,9]
    其中,第一个序列中 6 是在 5、7 之间的,所以它满足条件;相反第二个序列就不满足条件,所以只取最小和最大值的方案是不可行的,必须得遍历。
    jybox
        6
    jybox  
       2019-06-24 23:00:43 +08:00
    确实。在数据库这端大概筛选一下,缩小数据量就可以了,然后到应用后端再精确过滤一遍。
    strict
        7
    strict  
       2019-06-24 23:13:36 +08:00
    我愿意为知识付费 20 元。
    抱歉,这句话逗笑我了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   921 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:02 · PVG 05:02 · LAX 13:02 · JFK 16:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.