我从ST_IsValidDetail
页面上的示例中找到了一种方法。显然,以下语法是有效的:
SELECT gid, reason(ST_IsValidDetail(the_geom)), ST_AsText(location(ST_IsValidDetail(the_geom)))
注意函数调用周围的reason
and “调用”;location
返回的行中的列名ST_IsValidDetail
几乎被视为函数。事实证明,你可以欺骗 SQLAlchemy 做同样的事情。(假设session
是先前设置的Session
对象,并且db_geom
是 GeoAlchemy 几何对象。)
from sqlalchemy import func as sqlfunc
result = session.query(sqlfunc.reason(sqlfunc.ST_IsValidDetail(db_geom)), sqlfunc.ST_AsText(sqlfunc.location(sqlfunc.ST_IsValidDetail(db_geom)))).one()
result[0]
将包含原因,result[1]
并将包含位置的 WKT。(我们可以使用label
给列提供实际名称。)
要在不使用 PostGIS 功能的情况下对其进行修剪:
from sqlalchemy import func as sqlfunc
result = session.query(sqlfunc.columnname(sqlfunc.myrowfunc('some input string')).label('mylabel')).one()
这使得 SQLAlchemy 认为那columnname
是一个函数,并以形式将 SQL 发送到数据库
SELECT columnname(myrowfunc('some input string')) AS mylabel;
我还没有尝试过它,但是如果有一种方法可以让 SQLAlchemy 将我们的行视为我们正在选择的表FROM
,那也可以。(请参阅页面的最底部ST_IsValidDetail
。)