How to convert Python decimal to SQLite numeric?
I found that I had to make a small tweak to unutbu's approach. With a modified example with a value '4.00', it comes back out of the database as '4'. I'm dealing with commodities and don't want to hardcode the precision into the database (like I'd be doing if I just multiplied and divided by 100). So I tweaked the conversion functions as follows:
def adapt_decimal(d):
return '#'+str(d)
def convert_decimal(s):
return D(s[1:])
which isn't aesthetically great but does defeat sqlite's eagerness to store the field as an integer and lose track of the precision.
sqlite3
allows you to register an adapter (to transparently convert Decimals
to TEXT
when inserting) and a converter (to transparently convert TEXT
into Decimals
when fetching).
The following is a lightly modified version of the example code from the docs:
import sqlite3
import decimal
D=decimal.Decimal
def adapt_decimal(d):
return str(d)
def convert_decimal(s):
return D(s)
# Register the adapter
sqlite3.register_adapter(D, adapt_decimal)
# Register the converter
sqlite3.register_converter("decimal", convert_decimal)
d = D('4.12')
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES)
cur = con.cursor()
cur.execute("create table test(d decimal)")
cur.execute("insert into test(d) values (?)", (d,))
cur.execute("select d from test")
data=cur.fetchone()[0]
print(data)
print(type(data))
cur.close()
con.close()
yields
4.12
<class 'decimal.Decimal'>