为何同一查询在execCypher函数中通过两种方式被执行两次?
为什么execCypher函数要执行两次相同参数的查询?
先看问题中的execCypher函数代码:
def execCypher(conn:ext.connection, graphName:str, cypherStmt:str, cols:list=None, params:tuple=None) -> ext.cursor : if conn == None or conn.closed: raise _EXCEPTION_NoConnection cursor = conn.cursor() #clean up the string for modification cypherStmt = cypherStmt.replace("\n", "") cypherStmt = cypherStmt.replace("\t", "") cypher = str(cursor.mogrify(cypherStmt, params)) cypher = cypher[2:len(cypher)-1] preparedStmt = "SELECT * FROM age_prepare_cypher({graphName},{cypherStmt})" cursor = conn.cursor() try: cursor.execute(sql.SQL(preparedStmt).format(graphName=sql.Literal(graphName),cypherStmt=sql.Literal(cypher))) except SyntaxError as cause: conn.rollback() raise cause except Exception as cause: conn.rollback() raise SqlExecutionError("Execution ERR[" + str(cause) +"](" + preparedStmt +")", cause) stmt = buildCypher(graphName, cypher, cols) cursor = conn.cursor() try: cursor.execute(stmt) return cursor except SyntaxError as cause: conn.rollback() raise cause except Exception as cause: conn.rollback() raise SqlExecutionError("Execution ERR[" + str(cause) +"](" + stmt +")", cause)
这段代码是Apache AGE(PostgreSQL的图扩展)的Python驱动实现,两次执行并非重复跑同一业务查询,而是承担不同职责:
第一次执行
age_prepare_cypher:
这是预校验+预处理步骤。age_prepare_cypher是AGE内置函数,会先对传入的Cypher语句做语法解析、语义校验——比如检查指定的图是否存在、语句中的节点/关系类型是否合法、参数格式是否正确等。如果有问题会直接在这里抛出异常,提前终止流程,避免后续生成复杂执行语句后才报错,能大幅简化错误排查的成本。同时它也会在数据库层面完成Cypher语句的预解析工作,为后续真正执行铺路。第二次执行
buildCypher生成的语句:
这一步才是真正执行业务查询。buildCypher会结合图名称、校验后的Cypher语句以及指定列,生成最终可在PostgreSQL中执行的SQL语句,执行后返回查询结果的游标,供调用方获取数据。
两次执行的目标完全不同,不存在重复执行的冗余问题。
内容的提问来源于stack exchange,提问作者Jawad Ali Abbasi
相关产品推荐
相关产品推荐

