我试图从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)
答案 0 :(得分:1)
好吧,我有你的问题的答案,起初有几个建议:)
您不能使用r = q.all()
,因为它会创建一个新的不必要变量。只需使用该版本:
for row in q:
...
此外,q
也是不必要的。您可以在cicle中定义查询,如下所示:
for row in session.query(model).filter(...):...
您可以使用每行的_asdict()
方法代替__dict__
。只有结果的属性,没有_sa_*
属性
您可以在不使用字典语法的情况下获取row
的任何属性,如下所示:
tenant_id = row. tenant_id
嗯,答案。你可以使用dict compehensions:
result = {r.tenant_id: r._asdict() for r in q}
而且,正如我所说,你不能使用dict,因此,_asdict()
是不必要的。
就是这样。它有用吗?