|
1 | 1 | import datetime |
| 2 | +import decimal |
2 | 3 | import importlib |
3 | 4 | import logging |
4 | 5 | import re |
@@ -31,7 +32,6 @@ def execute(self, text, **params): |
31 | 32 | """ |
32 | 33 | Execute a SQL statement. |
33 | 34 | """ |
34 | | - |
35 | 35 | class UserDefinedType(sqlalchemy.TypeDecorator): |
36 | 36 | """ |
37 | 37 | Add support for expandable values, a la https://bitbucket.org/zzzeek/sqlalchemy/issues/3953/expanding-parameter. |
@@ -122,20 +122,27 @@ def process(value): |
122 | 122 | self.logger.debug(statement) |
123 | 123 |
|
124 | 124 | # if SELECT (or INSERT with RETURNING), return result set as list of dict objects |
125 | | - if re.search(r"^\s*SELECT\s+", statement, re.I): |
126 | | - rows = result.fetchall() |
127 | | - return [dict(row) for row in rows] |
| 125 | + if re.search(r"^\s*SELECT", statement, re.I): |
| 126 | + |
| 127 | + # coerce any decimal.Decimal objects to float objects |
| 128 | + # https://groups.google.com/d/msg/sqlalchemy/0qXMYJvq8SA/oqtvMD9Uw-kJ |
| 129 | + rows = [dict(row) for row in result.fetchall()] |
| 130 | + for row in rows: |
| 131 | + for column in row: |
| 132 | + if isinstance(row[column], decimal.Decimal): |
| 133 | + row[column] = float(row[column]) |
| 134 | + return rows |
128 | 135 |
|
129 | 136 | # if INSERT, return primary key value for a newly inserted row |
130 | | - elif re.search(r"^\s*INSERT\s+", statement, re.I): |
| 137 | + elif re.search(r"^\s*INSERT", statement, re.I): |
131 | 138 | if self.engine.url.get_backend_name() in ["postgres", "postgresql"]: |
132 | 139 | result = self.engine.execute(sqlalchemy.text("SELECT LASTVAL()")) |
133 | 140 | return result.first()[0] |
134 | 141 | else: |
135 | 142 | return result.lastrowid |
136 | 143 |
|
137 | 144 | # if DELETE or UPDATE, return number of rows matched |
138 | | - elif re.search(r"^\s*(?:DELETE|UPDATE)\s+", statement, re.I): |
| 145 | + elif re.search(r"^\s*(?:DELETE|UPDATE)", statement, re.I): |
139 | 146 | return result.rowcount |
140 | 147 |
|
141 | 148 | # if some other statement, return True unless exception |
|
0 commit comments