Skip to content

Commit 3f81ff6

Browse files
authoredJul 8, 2017
Merge pull request #29 from cs50/develop
improved PostgreSQL support
2 parents d362732 + d9cad38 commit 3f81ff6

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed
 

‎setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@
1616
package_dir={"": "src"},
1717
packages=["cs50"],
1818
url="https://github.com/cs50/python-cs50",
19-
version="2.1.0"
19+
version="2.1.1"
2020
)

‎src/cs50/sql.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import datetime
2+
import decimal
23
import importlib
34
import logging
45
import re
@@ -31,7 +32,6 @@ def execute(self, text, **params):
3132
"""
3233
Execute a SQL statement.
3334
"""
34-
3535
class UserDefinedType(sqlalchemy.TypeDecorator):
3636
"""
3737
Add support for expandable values, a la https://bitbucket.org/zzzeek/sqlalchemy/issues/3953/expanding-parameter.
@@ -122,20 +122,27 @@ def process(value):
122122
self.logger.debug(statement)
123123

124124
# 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
128135

129136
# 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):
131138
if self.engine.url.get_backend_name() in ["postgres", "postgresql"]:
132139
result = self.engine.execute(sqlalchemy.text("SELECT LASTVAL()"))
133140
return result.first()[0]
134141
else:
135142
return result.lastrowid
136143

137144
# 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):
139146
return result.rowcount
140147

141148
# if some other statement, return True unless exception

0 commit comments

Comments
 (0)
Please sign in to comment.