|
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