获取SQLAlchemy返回类型为Dict

时间:2016-02-18 06:39:30

标签: python dictionary sqlalchemy

我试图从SQLAlchemy表中获取一些细节。

考虑到存在针对不同租户的发票,我需要获取每个租户的发票详细信息。

已为相同的框架构建了API代码。

查看作为上述场景核心的代码。

def get_invoice(self):

    model = models.InvoiceDetails
    session = db.get_session()

    # Query the Table for all invoice
    q = session.query(model).order_by(model.id)

    n = {}

    r = q.all()

    for m in r:

            g = m.__dict__

            tenant_id = m.__dict__['tenant_id']

            n[tenant_id] = g

    return n 

我正在尝试获取返回的值。返回的值如下:

{u'b77865b66fd544e0841aa7dbca8bdc97': {'balance_cost': None, 'invoice_id': u'tenant_for_test-1-2016', '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7f608b7ed510>, 'id': 2}, u'7b73b9644e8242b3a740afc4659d9829': {'balance_cost': None, 'invoice_id': u'demo-1-2016', '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7f608b7ed550>, 'id': 1}}

上面的代码返回了上面的结果,即表中的两个发票条目。

然后在这里我需要查看结果并使用租户ID密钥获取所需的结果(u'b77865b66fd544e0841aa7dbca8bdc97',u'7b73b9644e8242b3a740afc4659d9829')

但由于它是unicode,我无法这样做。

相同的类型如下:

<type 'unicode'>

所以我的问题是如何根据tenant_id键获取invoice_dict(u'b77865b66fd544e0841aa7dbca8bdc97',u'7b73b9644e8242b3a740afc4659d9829')。

当我试图让它显示错误时如下:

    print invoice['tenant_id']
    TypeError: string indices must be integers

然后还需要从返回值中消除'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7f608b7ed510>

有人在帮助我做同样的事情。

如果不清楚或没有意义,请发表评论。

注意:

当我尝试在代码中打印n时,它很好,它实际上是一个字典。

但是当我尝试从外部使用API​​获取数据时。

结果只是一个unicode。

修改

invoiceDetails定义:

mysql> desc invoice_details;
+---------------------+--------------+------+-----+---------+----------------+
| Field               | Type         | Null | Key | Default | Extra          |
+---------------------+--------------+------+-----+---------+----------------+
| id                  | int(11)      | NO   | PRI | NULL    | auto_increment |
| invoice_date        | datetime     | NO   |     | NULL    |                |
| invoice_period_from | datetime     | NO   |     | NULL    |                |
| invoice_period_to   | datetime     | NO   |     | NULL    |                |
| tenant_id           | varchar(255) | NO   |     | NULL    |                |
| invoice_id          | varchar(255) | NO   |     | NULL    |                |
| invoice_data        | text         | NO   |     | NULL    |                |
| tenant_name         | varchar(255) | YES  |     | NULL    |                |
| total_cost          | float        | YES  |     | NULL    |                |
| paid_cost           | float        | YES  |     | NULL    |                |
| balance_cost        | float        | YES  |     | NULL    |                |
| payment_status      | varchar(255) | YES  |     | NULL    |                |
+---------------------+--------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)

1 个答案:

答案 0 :(得分:1)

好吧,我有你的问题的答案,起初有几个建议:)

  1. 您不能使用r = q.all(),因为它会创建一个新的不必要变量。只需使用该版本:

    for row in q: ...

  2. 此外,q也是不必要的。您可以在cicle中定义查询,如下所示:

    for row in session.query(model).filter(...):...

  3. 您可以使用每行的_asdict()方法代替__dict__。只有结果的属性,没有_sa_*属性

  4. 您可以在不使用字典语法的情况下获取row的任何属性,如下所示:

    tenant_id = row. tenant_id

  5. 嗯,答案。你可以使用dict compehensions:

    result = {r.tenant_id: r._asdict() for r in q}

  6. 而且,正如我所说,你不能使用dict,因此,_asdict()是不必要的。

    就是这样。它有用吗?