I have a program that reads financial data in JSON and inserts it into an SQLite database. The problem is when I’m inserting it into SQLite numeric column and it doesn’t seem to like the decimal object.
I’ve found this question answered before, but the answer is outdated and from what I understand SQLite now has a currency data type called numeric.
Right now as a workaround I’m storing decimal values as text, but is it possible to store it as numeric? Am I stuck with the overhead of converting decimals to strings and vice versa for database inserts and financial calculations?
Advertisement
Answer
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'>