Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQLAlchemy python中自连接表和选择列?_Python_Mysql_Sqlalchemy - Fatal编程技术网

如何在SQLAlchemy python中自连接表和选择列?

如何在SQLAlchemy python中自连接表和选择列?,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我想在SQLAlchemy python中实现自连接 我有一个表,表中有事件id,事件名称和事件父项id。我想从DB中为一些给定的事件id选择事件id、事件名称和父事件名称。以下代码未给出任何结果。 还有一个疑问,我将如何区分查询结果中的事件名称和父名称 @app.route("/api/bdi_data_events", methods=["GET"]) def get_bdi_data_events(): if request.method == "GET": try:

我想在SQLAlchemy python中实现自连接

我有一个表,表中有
事件id
事件名称
事件父项id
。我想从DB中为一些给定的事件id选择事件id、事件名称和父事件名称。以下代码未给出任何结果。 还有一个疑问,我将如何区分查询结果中的事件名称和父名称

@app.route("/api/bdi_data_events", methods=["GET"])
def get_bdi_data_events():
  if request.method == "GET":
    try:
        events = request.args.get('events')
        alias1 = BdiDataLifeCycle
        alias2 = BdiDataLifeCycle
        resp = db.session.query(alias1, alias2)\
                .join(alias1.event_parent_id, alias2.event_id)\
                .filter(alias1.event_id.in_(events.split(',')))\
                .values(alias1.event_id, alias1.event_name, alias2.event_name,\
                alias1.event_sequence,\
                alias1.event_reg_dt, alias1.deleted)
        d = []
        print resp
        for i in resp:
            j = {"event_id": i.event_id,"event_name":i.event_name,"event_desc":i.event_desc,"event_name":i.event_name,\
                "event_reg_dt": i.event_reg_dt,"deleted": i.deleted\
                }
            d.append(j)
        return jsonify({"status":"success","response":d})
    except Exception, e:
        print "exception occured-->"
        print e
        return raiseError(BAD_REQUEST, {"message":str(e)})
  else:
    return jsonify({"status":"success"})
等价的
MySQL
query给出正确的结果

SELECT a.event_id, a.event_name, b.event_name as parent FROM bdi_data_life_cycle a 
left join  bdi_data_life_cycle b on 
a.event_parent_id = b.event_id
where a.event_id in (1,2,3,73,83,95,96,97,98)


event_id, event_name, parent
'1', 'data_event', NULL
'2', 'test_event4455', 'data_event'
'3', 'test_event5', 'data_event'
'73', 'test_event10', 'data_event'
'83', 'test_event7', 'data_event'
'95', 'test_event101', 'data_event'
'96', 'test_event100', 'data_event'
'97', 'test_event120', 'data_event'
'98', 'test10', 'data_event'

在这种情况下,事件id 1是所有剩余事件的父事件。

我已解决此问题,将提供解决方案。我没有使用正确的别名。我使用了错误的连接。我们应该使用
标签
作为列别名

@app.route("/api/bdi_data_events", methods=["GET"])
def get_bdi_data_events():
  if request.method == "GET":
    try:
        events = request.args.get('events')
        alias1 = aliased(BdiDataLifeCycle)
        alias2 = aliased(BdiDataLifeCycle)
        resp = db.session.query(alias1, alias2)\
                .outerjoin(alias2, alias1.event_parent_id==alias2.event_id)\
                .filter(alias1.event_id.in_(events.split(',')))\
                .filter(alias2.event_parent_id == None)\
                .values(alias1.event_id, alias1.event_name, alias1.event_desc,\
                alias1.event_sequence,\
                alias1.event_reg_dt, alias1.deleted, alias2.event_name.label("event_parent_name"))
        d = []
        print resp
        for i in resp:
            j = {"event_id": i.event_id,"event_name":i.event_name,"event_desc":i.event_desc,"event_sequence":i.event_sequence,\
                "event_reg_dt": i.event_reg_dt,"deleted": i.event_parent_name,"event_parent_name": i.event_parent_name\
                }
            d.append(j)
        return jsonify({"status":"success","response":d})
    except Exception, e:
        print "exception occured-->"
        print e
        return raiseError(BAD_REQUEST, {"message":str(e)})
  else:
    return jsonify({"status":"success"})

它没有给出适当的结果。它应该有9行。它有8排。不是“1”,“数据事件”,空,那么如何获取事件名称和父事件名称?