SqlAlchemy sql.text提升限制子句

时间:2018-08-25 18:06:02

标签: python postgresql sqlalchemy

我有python3 + flask + sqlalchemy + postgres

我有一堆自定义查询,我提供的数据以json分页。

from sqlalchemy.sql import text
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
db.engine.execute('SELECT * FROM MY_TABLE LIMIT :limit OFFSET :offset',
                   limit=limit, offset=offset)

到目前为止,我可以传递limitvalues的整数值。

但是,有时我需要完整的数据而不是分页的数据。

的等效查询为

SELECT * FROM MY_TABLE LIMIT ALL OFFSET 0

因此,我尝试通过limit='ALL'offset=0

SQLAlchemy抱怨

sqlalchemy.exc.DataError: (psycopg2.DataError) invalid input syntax for integer: "ALL"
LINE 1: ...T_LABEL_ID IN (2, 5) ORDER BY TIMESTAMP_RAW LIMIT 'ALL' OFFS...

ALL是保留关键字,不希望作为字符串传递

我的问题是,除了有条件地仅在需要时向我的查询中添加LIMIT :limit OFFSET :offset之外,还有其他更好的方法吗?

1 个答案:

答案 0 :(得分:1)

执行类似操作的最好方法是分配一个任意大的数字。像这样

from sqlalchemy.sql import text
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
db.engine.execute('SELECT * FROM MY_TABLE LIMIT :limit OFFSET :offset',
                   limit=99999999999999, offset=offset)

您已经尝试过another way if your database is postgres。即添加LIMIT ALL。由于出现错误,因此我假设您正在使用Mysql或其他数据库。

更新

如Sundeep所述,该错误是由于字符串替换引起的。因此,另一种方法是。

db.engine.execute('SELECT * FROM MY_TABLE LIMIT {limit} OFFSET {offset}'.format(limit='ALL', offset=offset))