これは、@vanと@JosefAssadの両方に触発されたソリューションです。
class SqliteDecimal(TypeDecorator):
# This TypeDecorator use Sqlalchemy Integer as impl. It converts Decimals
# from Python to Integers which is later stored in Sqlite database.
impl = Integer
def __init__(self, scale):
# It takes a 'scale' parameter, which specifies the number of digits
# to the right of the decimal point of the number in the column.
TypeDecorator.__init__(self)
self.scale = scale
self.multiplier_int = 10 ** self.scale
def process_bind_param(self, value, dialect):
# e.g. value = Column(SqliteDecimal(2)) means a value such as
# Decimal('12.34') will be converted to 1234 in Sqlite
if value is not None:
value = int(Decimal(value) * self.multiplier_int)
return value
def process_result_value(self, value, dialect):
# e.g. Integer 1234 in Sqlite will be converted to Decimal('12.34'),
# when query takes place.
if value is not None:
value = Decimal(value) / self.multiplier_int
return value
@Jinghui Niuが述べたように、10進数がsqliteに文字列として格納されている場合、session.query(T).filter(T.value> 100)やsqlalchemy.sqlなどの一部のクエリは常に期待どおりに機能するとは限りません。 expression.func.min、またはorder_byです。これは、SQLが、これらの場合に予想された数値ではなく、文字列(たとえば、文字列の「9.2」>「19.2」)を比較するためです。