我正在尝试使用SQLAlchemy作为db.session在Flask应用程序中表示SQL连接

时间:2018-10-30 21:29:02

标签: python flask-sqlalchemy

apInfo = db.engine.execute(
    "select L.circuit_id, L.remote_id, AP_I.vlan, AP_I.color \
     from leases as L, ap_info as AP_I \
     where L.circuit_id = AP_I.mac_address and \
           L.remote_id = '%s'; " % sm_mac_.remote_id[:17]).fetchone()

这将正确生成:  (u'0a:00:3e:bb:76:54',u'0a:00:3e:bb:c1:f7',12,77))

我尝试将其表示为:

apInfo = db.session.query(LEASES, AP_INFO) \
    .filter(LEASES.circuit_id == AP_INFO.mac_address)\
    .filter(LEASES.remote_id == sm_mac_.remote_id[:17])\
    .all ()

产生一个包含元组的列表?      [([<< strong> main .LEASES对象位于0x101f039d0>,<< strong> main .AP_INFO对象位于0x101f0e410>]]

试图确定如何修改db.session或从产生的数据中提取数据。

2 个答案:

答案 0 :(得分:0)

这有效,但是没有完成!

ret = db.session.query(LEASES, AP_INFO) \
             .filter(LEASES.circuit_id == AP_INFO.mac_address)\
             .filter(LEASES.remote_id == sm_mac_.remote_id[:17])\
             .all ()

apInfo = (ret[0].LEASES.circuit_id, \
   ret[0].LEASES.remote_id, \
   ret[0].AP_INFO.vlan, \
   ret[0].AP_INFO.color)

我想找到一种直接从查询中返回值的方法;改善查询条件。

答案 1 :(得分:0)

您似乎想使用.one()而不是.all()

apInfo = db.session.query(LEASES, AP_INFO) \
    .filter(LEASES.circuit_id == AP_INFO.mac_address)\
    .filter(LEASES.remote_id == sm_mac_.remote_id[:17])\
    .one()

第一个使用Engine的示例返回一个ResultProxy,然后您可以使用它来调用ResultProxy.fetchone()

但是,您使用db.Session的第二个示例使用Query.all()总是返回包装在列表中的结果:

all()

    Return the results represented by this Query as a list.

如果您只希望得到一个结果,请改用Query.one()Query.one_or_none

或者,如果您的查询可能返回多个结果,但您只想要第一个,则有Query.first()