On 08/25/2016 03:17 PM, Dominik George wrote:
To be more precise:
I have a query like this one:
|
session.query(osmalchemy.node).filter(osmalchemy.node.tags.any(key="name",value="Grill-Corner")).all()
|
It ultimately compiles to this QL expression:
|
query =SELECT osm_nodes.element_id AS
osm_nodes_element_id,osm_elements.element_id AS
osm_elements_element_id,osm_elements.osmalchemy_updated AS
osm_elements_osmalchemy_updated,osm_elements.type AS
osm_elements_type,osm_elements.id AS
osm_elements_id,osm_elements.version AS
osm_elements_version,osm_elements.changeset AS
osm_elements_changeset,osm_elements.user AS
osm_elements_user,osm_elements.uid AS
osm_elements_uid,osm_elements.visible AS
osm_elements_visible,osm_elements.timestamp AS
osm_elements_timestamp,osm_nodes.latitude AS
osm_nodes_latitude,osm_nodes.longitude AS osm_nodes_longitude
FROM osm_elements JOIN osm_nodes ON osm_elements.element_id
=osm_nodes.element_id
WHERE EXISTS (SELECT 1
FROM osm_elements_tags
WHERE osm_elements.element_id =osm_elements_tags.element_id AND (EXISTS
(SELECT 1
FROM osm_tags
WHERE osm_tags.tag_id =osm_elements_tags.tag_id AND osm_tags.value =?AND
osm_tags."key"=?)))
|
I want to programmatically get to the last two comparisons, i.e. the
criterion of the .any() call in the initial query.
I am receiving this query in a before_compile trigger in a library using
SQLAlchemy.
so before_compile() does not receive a core Select, it receives the
Query before anything has been done to it yet. However, any() generate
a SELECT. So you need to look in both.
You can generically iterate through the elements of a Core element using
get_children():
@event.listens_for(Query, "before_compile")
def show_any_filter(query):
stack = [query._criterion]
while stack:
elem = stack.pop(-1)
if isinstance(elem, sql.selectable.Select):
print("WHERECLAUSE: %s" % elem._whereclause)
else:
stack.extend(elem.get_children())
-nik
--
You received this message because you are subscribed to the Google
Groups "sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send
an email to [email protected]
<mailto:[email protected]>.
To post to this group, send email to [email protected]
<mailto:[email protected]>.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.