Replacing value in all cursor rows

萝らか妹 提交于 2021-02-19 03:08:06

问题


Using SQLite and Python 3.1, I want to display currency data in a HTML table via. a template which accepts a cursor as a parameter. Hence all currency values must have 2 decimal places, but SQLite stores them as float type (even though the structure states decimal :-( ) so some must be converted before display (eg. I want 12.1 displayed as 12.10).

The code goes something like this (simplified for illustration)...

import sqlite3
con = sqlite3.connect("mydb")
con.row_factory = sqlite3.Row

cur = con.cursor()
cur.execute("select order_no, amount from orders where cust_id=123")

for row in cur:
   row['amount'] = format(row['amount'],'%.2f')

The last command throws the error "# builtins.TypeError: 'sqlite3.Row' object does not support item assignment"

How can I solve the problem whereby the row object values cannot be changed? Could I convert the cursor to a list of dictionaries (one for each row, eg. [{'order_no':1, 'amount':12.1}, {'order_no':2, 'amount':6.32}, ...]), then format the 'amount' value for each item? If so, how can I do this?

Are there any better solutions for achieving my goal? Any help would be appreciated.

TIA, Alan


回答1:


Yep:

cur.execute("select order_no, amount from orders where cust_id=123")
dictrows = [dict(row) for row in cur]
for r in dictrows:
  r['amount'] = format(r['amount'],'%.2f')

There are other ways, but this one seems the simplest and most direct one.




回答2:


An alternative is to store your value as an integer number of cents (which is always an exact amount, no rounding), and then convert to dollars when displaying for reports using divmod:

>>> value_in_cents = 133
>>> print "$%d.%d" % divmod(value_in_cents,100)
$1.33


来源:https://stackoverflow.com/questions/3380360/replacing-value-in-all-cursor-rows

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!