mirror of
https://github.com/sqlalchemy/sqlalchemy.git
synced 2026-05-19 15:12:04 -04:00
document TypeDecorator schemes for MONEY
this type apparently returns strings so document cast/processing options. Change-Id: Idc19527dcf76e1c2d966425716c0fcf60cbba5dc References: #5965
This commit is contained in:
@@ -1539,7 +1539,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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user