import sqlite3
import decimal

class DecimalSum:
    def __init__(self):
        self.sum = None

    def step(self, value):
        if value is None:
            return
        v = decimal.Decimal(value)
        if self.sum is None:
            self.sum = v
        else:
            self.sum += v

    def finalize(self):
        return None if self.sum is None else str(self.sum)

def adapt_decimal(d):
    return str(d)

def convert_decimal(s):
    return decimal.Decimal(s.decode('ascii')) # required for Python 3

# Register the adapter
sqlite3.register_adapter(decimal.Decimal, adapt_decimal)
# Register the converter
sqlite3.register_converter("DECTEXT", convert_decimal)

# We need also sqlite3.PARSE_COLNAMES for returning correct type for
# aggregate function decimal_sum:
con = sqlite3.connect(":memory:", detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
con.create_aggregate("decimal_sum", 1, DecimalSum)
cur = con.cursor()
cur.execute("""CREATE TABLE a_test(
  a_decimal DECTEXT NOT NULL  -- will be stored as TEXT
)""")

con.execute("INSERT INTO a_test VALUES(?)", (decimal.Decimal("102.20"),))
# Convert sum to decimal explicitly:
cur.execute("SELECT decimal_sum(a_decimal) AS `s [DECTEXT]` from a_test")
data = cur.fetchone()[0]
print(data)
print(type(data))

cur.close()
con.close()