【问题标题】:Parsing result from sqlalchemy stored procedure execution解析来自 sqlalchemy 存储过程执行的结果
【发布时间】:2017-09-15 02:28:15
【问题描述】:

我在 postgresql 数据库中有一个存储过程。

我正在尝试在带有 sqlalchemy 的 python 烧瓶应用程序中使用该函数。该查询如下所示:

from sqlalchemy import func

appts = db.session.execute(func.getopenappointments(current_user.id))

for appt in appts:
    # work with each appt

此查询的结果是 sqlalchemy.engine.result.ResultProxy 类型的对象。该对象的每次迭代都如下所示:

('(2,"2017-09-15 10:00:00",6,cleaning,available,5)',)

问题是我习惯于用类似这样的方式来引用列:

for appt in appts:
    print(appt.id)

但是由于 id 不存在而失败。我已经意识到输出几乎是一个字符串,我必须用 python split() 解析它才能获得我需要的值。我如何才能将其保留为存储过程,但能够按列引用输出,或者至少作为元组而不是常规字符串?

【问题讨论】:

  • 为什么你的记录是这样格式化的?
  • 我认为这是关键问题。该记录没有按照我期望的格式与典型的 sqlalchemy 结果格式化。但这是我执行存储过程得到的结果。
  • 你知道结果中每个“字段”的数据类型吗? “清洁”和“可用”是什么类型?字符串?
  • 您使用的是什么数据库? getopenappointments 是如何定义的?包括一个正确的minimal reproducible example
  • 感谢您的反馈!我更详细地更新了问题。

标签: python sqlalchemy


【解决方案1】:

看看this question。有一个名为from_statement 的构造可用于将 SQL 语句的结果解释为 SQLAlchemy ORM 模型。 所以我假设你有一个 Appointment 类,它是一个 ORM 映射器,要么是因为你使用了 declarative_base 要么是因为你直接使用了映射器函数。 然后你可以做类似的事情

appts = db.session.query(Appointment).from_statement(func.getopenappointments(current_user.id))

如果它是一组Appointment 对象,它将运行您的 SQL 存储过程并解释结果。

【讨论】:

  • @Ilja Everilä 链接已修复,抱歉
猜你喜欢
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多