]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
document TypeDecorator schemes for MONEY
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 22 Feb 2021 14:55:21 +0000 (09:55 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 22 Feb 2021 14:56:16 +0000 (09:56 -0500)
this type apparently returns strings so document
cast/processing options.

Change-Id: Idc19527dcf76e1c2d966425716c0fcf60cbba5dc
References: #5965
(cherry picked from commit fcf539d090a95fb179ca03beffd10122e97aa002)

lib/sqlalchemy/dialects/postgresql/base.py

index 7dec6d8182b7f0f19f0eda6a224f1688f8fe9280..a33435216e1f78cbaa45e25e0ceff4a35d732ebb 100644 (file)
@@ -1196,7 +1196,41 @@ PGMacAddr = MACADDR
 
 class MONEY(sqltypes.TypeEngine):
 
-    """Provide the PostgreSQL MONEY type.
+    r"""Provide the PostgreSQL MONEY type.
+
+    Depending on driver, result rows using this type may return a
+    string value which includes currency symbols.
+
+    For this reason, it may be preferable to provide conversion to a
+    numerically-based currency datatype using :class:`_types.TypeDecorator`::
+
+        import re
+        import decimal
+        from sqlalchemy import TypeDecorator
+
+        class NumericMoney(TypeDecorator):
+            impl = MONEY
+
+            def process_result_value(self, value: Any, dialect: Any) -> None:
+                if value is not None:
+                    # adjust this for the currency and numeric
+                    m = re.match(r"\$([\d.]+)", value)
+                    if m:
+                        value = decimal.Decimal(m.group(1))
+                return value
+
+    Alternatively, the conversion may be applied as a CAST using
+    the :meth:`_types.TypeDecorator.column_expression` method as follows::
+
+        import decimal
+        from sqlalchemy import cast
+        from sqlalchemy import TypeDecorator
+
+        class NumericMoney(TypeDecorator):
+            impl = MONEY
+
+            def column_expression(self, column: Any):
+                return cast(column, Numeric())
 
     .. versionadded:: 1.2