【问题标题】:Syntax for row_to_json with sqlalchemy使用 sqlalchemy 的 row_to_json 语法
【发布时间】:2016-08-28 20:23:51
【问题描述】:

我想弄清楚如何将 Postgres 的 (9.2) row_to_json 与 SqlAlchemy 一起使用。但是我还没有想出任何有效的语法。

details_foo_row_q = select([Foo.*]
    ).where(Foo.bar_id == Bar.id
).alias('details_foo_row_q')

details_foo_q = select([
    func.row_to_json(details_foo_row_q).label('details')
]).where(details_foo_row_q.c.bar_id == Bar.id
).alias('details_foo_q')

如果可能,我希望不必从表模型中输入每个字段。

从'mn'得到答案:

应该是这样的:

details_foo_row_q = select([Foo]).where(Foo.bar_id == Bar.id).alias('details_foo_row_q')

details_foo_q = select([
    func.row_to_json(literal_column(details_foo_row_q.name)).label('details')
]).select_from(details_foo_row_q).where(
    details_foo_row_q.c.bar_id == Bar.id
).alias('details_foo_q')

谢谢你,太好了!

【问题讨论】:

    标签: python json postgresql sqlalchemy postgresql-9.2


    【解决方案1】:

    您的查询生成了不正确的 SQL

    SELECT row_to_json(SELECT ... FROM foo) AS details
    FROM (SELECT ... FROM foo) AS details_foo_row_q
    

    应该是

    SELECT row_to_json(details_foo_row_q) AS details
    FROM (SELECT ... FROM foo) AS details_foo_row_q
    

    您需要使用 select as literal_column

    from sqlalchemy.sql.expression import literal_column
    
    details_foo_q = select([
        func.row_to_json(literal_column(details_foo_row_q.name)).label('details')
    ]).select_from(details_foo_row_q).where(
        details_foo_row_q.c.bar_id == Bar.id
    ).alias('details_foo_q')
    

    【讨论】:

    • 它有效!我猜是由于“名称”变量以及literal_column
    【解决方案2】:

    如果其他人还在为row_to_json 功能而苦恼,我有个好消息要告诉你。 假设我们有 User 类,字段为 email, id,我们希望接收电子邮件和 id 字段作为 JSON。 这可以使用 json_build_object 函数来完成:

    from sqlalchemy import func
    
    session.query(func.json_build_object("email", User.email, "id", User.id))
    

    【讨论】:

      【解决方案3】:

      听起来好像有一个解决方案 IFF 您正在使用最新的 SQLAlchemy:

      # New in version 1.4.0b2.
      >>> from sqlalchemy import table, column, func, select
      >>> a = table( "a", column("id"), column("x"), column("y"))
      >>> stmt = select(func.row_to_json(a.table_valued()))
      >>> print(stmt)
      SELECT row_to_json(a) AS row_to_json_1
      FROM a
      

      https://docs.sqlalchemy.org/en/14/dialects/postgresql.html#table-types-passed-to-functions

      【讨论】:

        猜你喜欢
        • 2018-11-27
        • 1970-01-01
        • 2014-10-29
        • 2018-12-12
        • 1970-01-01
        • 2012-10-24
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        相关资源
        最近更新 更多