在postgresql上从sqlalchemy执行原始sql查询

时间:2018-03-29 21:37:29

标签: python postgresql sqlalchemy flask-sqlalchemy

我有一个原始的SQL查询:

select distinct(user_id) from details_table where event_id in (29,10) and user_id in (7,11,24,45) and epoch_timestamp >= 1433116800 and epoch_timestamp <= 1506816000;

psql中返回:

 user_id 
---------
       7
      24
(2 rows)

现在,当我通过sqlalchemy运行这个原始的sql查询时,我得到一个sqlalchemy.engine.result.ResultProxy对象作为响应而不是上面的结果。我现在使用的代码如下:

from flask import current_app
sql_query = text(select distinct(user_id) from details_table where event_id in (29,10) and user_id in (7,24) and epoch_timestamp >= 1433116800 and epoch_timestamp <= 1506816000;)

filtering_users = db.get_engine(current_app, bind='<my_binding>')\
                    .execute(sql_query)
print(type(filtering_users))
# <class 'sqlalchemy.engine.result.ResultProxy'>
print(filtering_users)
# <sqlalchemy.engine.result.ResultProxy object at 0x7fde74469550>

我使用了来自here的引用,但与解决方案不同的是,我得到了一个ResultProxy对象。

我在这里做错了什么?我的最终目标是获取从执行原始sql-query返回的用户列表,并将其存储到列表中。

2 个答案:

答案 0 :(得分:3)

正如SQLAlchemy documentation所解释的那样,.execute()方法仅返回您必须迭代(或应用任何聚合方法)的代理,以查看查询的实际结果。显然,在您的情况下,您想要的是.fetchall() method

如果您尝试这样的事情:

from sqlalchemy import create_engine

engine = create_engine('/path/to/your/db...')
connection = engine.connect()

my_query = 'SELECT * FROM my_table'
results = connection.execute(my_query).fetchall()

results变量将是查询提取的所有项目的list

希望这有帮助!

答案 1 :(得分:0)

现在解决了,问题是因为我将查询转换为text类型,然后将其传递给引擎执行,现在我认为在通过引擎执行原始sql时并不需要。 所以我在代码中所做的唯一改变是:

sql_query="select distinct(user_id) from details_table where event_id in (29,10) and user_id in (7,11,24,45) and epoch_timestamp >= 1433116800 and epoch_timestamp <= 1506816000"