【问题标题】:Converting a mysql with Nested SELECT, EXIST, SELECT NEXT clauses to a python sqlalchemy statement将带有嵌套 SELECT、EXIST、SELECT NEXT 子句的 mysql 转换为 python sqlalchemy 语句
【发布时间】:2014-03-12 19:22:11
【问题描述】:

所以我有这个说法

SELECT h.usd FROM historic h, block b 
WHERE UNIX_TIMESTAMP(h.timestamp) <=b.block_nTime 
AND NOT EXISTS 
(SELECT 'NEXT' FROM 
historic h2 where h2.timestamp > h.timestamp 
AND UNIX_TIMESTAMP(h2.timestamp) <=b.block_nTime) AND b.block_id = 'id'

我正在尝试将其转换为 python sqlalchemy 语句 - 这就是我得到的结果。

from sqlalchemy import *
from sqlalchemy.sql import func
from sqlalchemy.orm import Session

#{...}

h = alias(historic)
h2 = alias(historic)

session.query(h.c.usd).filter(
and_(h.c.timestamp <= block.c.block_nTime,   
~exists(
func.next_value(Sequence(h2.c.timestamp))
).where(
and_(h2.c.timestamp > h.c.timestamp, h2.c.timestamp <= block.c.block_nTime
) & block.c.id == block_id)))

我也是如何得到这个错误的:

sqlalchemy.exc.ArgumentError: columns argument to select() must be a Python list or other iterable

认为我没有正确使用Sequence()。可能是什么问题?

提前致谢!

【问题讨论】:

    标签: python mysql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您收到的错误引用了exists。只需将参数包装在一个列表中,它应该可以工作:

    Before: ~exists(func.next_value(Sequence(h2.c.timestamp)))
    After: ~exists([func.next_value(Sequence(h2.c.timestamp))])

    【讨论】:

    • 感谢成功,但现在是一个新问题 - NotImplementedError: Dialect 'mysql' does not support sequence increments
    • 好吧,从codebase 可以看出,sqlalchemy 仅支持 firebird、oracle 和 postgresql。请自行实现或添加请求至sqlalchemy issues
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 2021-10-17
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2012-10-09
    • 2010-09-12
    相关资源
    最近更新 更多